2012-08-14 44 views
4

我正在使用ShDocVw interop程序集來獲取到InternetExplorer對象。需要一種方法來區分ShDocVw.InternetExplorer選項卡對象

foreach(InternetExplorer IE in new ShellWindowsClass()) 
{ 
    Console.Log(IE.HWND.ToString() + Environment.NewLine); 
} 

結果是 - 同一窗口報告HWND的所有標籤等於該MainWindowHandle window`s過程。實際上,我無法在這些對象中找到任何可以區分它們的不同信息。

我需要將這些實例關聯到真正的選項卡,以便將它們與Windows事件(主要改變窗口焦點)進行匹配。找到該對象與相應的Frame TabTabWindowClass窗口實例之間的鏈接會很好。

任何想法如何實現這一目標?

回答

4

好吧,這是不完美的,但在這裏就是我想出了:

  1. 獲取HWNDInternetExplorer對象,這是窗口的句柄。
  2. 使用EnumChildWindowsFindWindowEx遍歷它的孩子,並找到Frame Tab類別的子窗口。你會得到一個IntPtr tabHandle - 標籤的句柄。我個人更喜歡,因爲它不會使用回調,但是在循環中迭代...
  3. 然後,在#2中發現的tabHandle上再次使用FindWindowEx,以找到類TabWindowClass的孩子。你會得到IntPtr tabTitleHandle - 這是一個窗口,其中包含選項卡窗口標題(其中包括位置名稱+「 - Internet Explorer的smth」,我寫「smth」,因爲這個文本可以改變,因爲MSIE分佈可以定製)。
  4. 使用GetWindowTexttabTitleHandle上獲得窗口標題。
  5. 現在,通過InternetExplorer迭代ShellWindowsClass集合中的對象,首先檢查PID - 我們只需要比較同一個進程創建的實例,然後檢查你在#4中獲得的窗口標題是否爲.StartsWith(IE.LocationName + " - ")。注意「 - 」,因爲我們可以假定會有一些文本標識瀏覽器本身,但是因爲它可以被定製 - 不能真的猜到它。如果窗口標題以位置名稱開頭,我們會假設它們是核心名稱。

正如我所說,這是不完美的(因爲最終的比賽是由標題),但這是迄今爲止最好的。希望它會有所幫助。而我仍在等待完美的解決方案,不斷挖掘傢伙! ;)

相關問題