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を使う、という手もあります。
同じタイトルのタブなんて開かない、という場合はタイトルに小細工を加える必要はなくなります。