2012-08-14 2 views
4

InternetExplorer 개체를 얻으려면 ShDocVw interop 어셈블리를 사용하고 있습니다.ShDocVw.InternetExplorer 탭 개체를 구별 할 방법이 필요합니다.

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

결과는 - 같은 창 보고서 HWND의 모든 탭은의 MainWindowHandle이 과정을 window`s 같습니다. 사실, 서로 구별 할 수있는 이러한 개체의 고유 한 정보를 찾을 수 없습니다.

그리고 이러한 인스턴스를 실제 이벤트와 연관시키기 위해서는 이러한 이벤트를 실제 이벤트와 연관시켜야합니다. 이 개체와 해당 Frame Tab 또는 TabWindowClass 창 인스턴스 간의 연결을 찾는 것이 좋습니다.

아이디어를 얻으려면 어떻게해야합니까? 좋아

답변

4

, 이것은 완벽하지,하지만 여기에 내가 무엇을 최대 온의 :

  1. InternetExplorer 객체에서 HWND를 취득, 이것은 의 핸들입니다.
  2. EnumChildWindows 또는 FindWindowEx을 사용하여 chlidren을 트래버스하고 Frame Tab 클래스의 하위 창을 찾습니다. 의 핸들 인 IntPtr tabHandle을 받게됩니다. 나는 개인적으로 여기에 FindWindowEx을 더 좋아한다. 왜냐하면 콜백을 사용하지 않을 것이기 때문에 콜백을 사용하지 않을 것이기 때문이다.
  3. 그런 다음 #을 tabHandle에서 다시 사용하여 TabWindowClass 아이를 갖게한다. 당신은 IntPtr tabTitleHandle을 얻을 것입니다 - 탭 윈도우 제목 (위치 이름 + "- 인터넷 익스플로러 smth"를 포함하고 있습니다.이 텍스트는 MSIE 배포판을 사용자 정의 할 수 있기 때문에 "smth"라고 쓰여 있습니다)를 저장하는 창입니다.
  4. tabTitleHandleGetWindowText을 사용하면 창 제목을 얻을 수 있습니다.
  5. 이제 ShellWindowsClass 컬렉션에있는 InternetExplorer 개체를 반복합니다. 먼저 PID를 확인하십시오. 동일한 프로세스에서 생성 된 인스턴스를 비교하기 만하면 # 4의 창 제목이 있는지 확인하십시오. .StartsWith(IE.LocationName + " - "). 브라우저 자체를 식별하는 텍스트가 있다고 가정 할 수 있지만 사용자 정의 할 수 있으므로 실제로 추측 할 수는 없으므로 "-"에 유의하십시오. 창 제목이 위치 이름으로 시작하면, 우리는 그들이 corellate 가정합니다.

내가 말했듯이, 이것은 완벽하지 않습니다 (최종 일치는 제목으로 이루어지기 때문에).하지만 지금까지 내가 가진 최선입니다. 희망이 도움이 될 것입니다. 그리고 저는 여전히 완벽한 솔루션을 기다리고 있습니다. ;)

관련 문제