UWSCでIEのカレントタブを取得する
しろまささんから、カレントのタブを取得するお題を頂いたので考えてみた。
以前書いた方法だと、ちゃんとしたIEオブジェクトではない(確かに、一部プロパティやイベントにアクセスできない、、、)
この辺はいろいろと難しいので、ちょっと保留。(現時点でギブアップ)
不要かもしれないけど、お茶濁しのために別の方法を考えてみる。
結論:タイトルで小細工すればいいんじゃない?
考察
- GetActiveOleObjで列挙して、Status関数で取得したタイトルと比較すれば、OK
- でも、同じタイトルのタブを開いてたら?
- 一時的にタイトルを書きかえて、それから比較すればよくない?
スクリプト
FUNCTION GetCurrentTab(id) CONST PRE_FIX = "<#SEARCH_CURRENT_TAB>" RESULT = NULL HASHTBL res DIM hwnd = IDTOHND(id), ie, i = 0, title COM_ERR_IGN WHILE !COM_ERR_FLG i = i + 1 ie = GETACTIVEOLEOBJ("InternetExplorer.Application", , i) IFB !COM_ERR_FLG AND ie.hwnd = hwnd THEN IFB POS(DECODE(ie.document.title, CODE_URL), STATUS(id, ST_TITLE)) = 1 THEN RESULT = ie res[LENGTH(res)] = ie ENDIF ENDIF WEND COM_ERR_RET IFB LENGTH(res) > 1 THEN RESULT = NULL i = 0 WHILE (i < LENGTH(res) AND RESULT = NULL) ie = res[i] title = ie.document.title ie.document.title = PRE_FIX + title SLEEP(0.2) // title反映にね、時間がかかるみたい IFB POS(PRE_FIX + DECODE(title, CODE_URL), STATUS(id, ST_TITLE)) = 1 THEN RESULT = ie res[LENGTH(res)] = ie ENDIF ie.document.title = title i = i + 1 WEND ENDIF FEND
長い。少し短くして
じゃ、一旦重複がないか見ないで、即タイトル小細工しましょうか。
FUNCTION GetCurrentTab(id) CONST PRE_FIX = "<#SEARCH_CURRENT_TAB>" RESULT = NULL DIM hwnd = IDTOHND(id), ie, i = 0, title COM_ERR_IGN WHILE !COM_ERR_FLG AND (RESULT = NULL) i = i + 1 ie = GETACTIVEOLEOBJ("InternetExplorer.Application", , i) IFB !COM_ERR_FLG AND ie.hwnd = hwnd THEN title = ie.document.title ie.document.title = PRE_FIX + title SLEEP(0.2) // title反映にね、時間がかかるみたい IFB POS(PRE_FIX + DECODE(title, CODE_URL), STATUS(id, ST_TITLE)) = 1 THEN RESULT = ie ENDIF ie.document.title = title ENDIF WEND COM_ERR_RET FEND
GETACTIVEOLEOBJで回すのでなく、Shell.Applictionを使う、という手もあります。
同じタイトルのタブなんて開かない、という場合はタイトルに小細工を加える必要はなくなります。