2011-02-09 6 views
4

실행중인 IE8 프로세스에서 SHDocVw.InternetExplorer 인스턴스를 얻어야하는 프로그램이 있습니다. 인스턴스를 얻으려면 아래 예제 코드가 실행됩니다. 어떤 이유로 Thread.Sleep 없이는 작동하지 않습니다.나는 SHDocVw.ShellWindows와 함께 Thread.Sleep을 사용하지 않을 것입니다.

Thread.Sleep가 제거되면 Browser.HWND가 m_IEFoundBrowsers의 모든 인스턴스에 대해 InvalidCastException을 발생시킵니다. Thread.Sleep을 사용하면 IE8 창에서 작동합니다.

누군가 Thread.Sleep을 사용하지 않는 방법으로이 작업을 수행하는 방법을 알고 있습니까?

예제 코드 (나는 ... 보통 그냥 미래에 문제를 밀어, 절전 기능을 사용하고 싶지 않다) :

InternetExplorer m_IEBrowser = null; 
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass(); 
Thread.Sleep(10);       
foreach (InternetExplorer Browser in m_IEFoundBrowsers) 
{ 
    try 
    { 
     if (Browser.HWND == (int)m_Proc.MainWindowHandle) 
     { 
       m_IEBrowser = Browser; 
       break; 
     } 
     } 
     catch(InvalidCastException ice) 
     { 
      //Do nothing. Browser.HWND could not execute for this item. 
     } 
}   
+0

무슨 일이되기 전에 어떻게됩니까? IE를 직접 시작 하시겠습니까? 시작하는 데 시간이 필요합니다. –

+0

'새로운 ShellWindowsClass()'는 사용할 준비가 될 때까지 차단 될 것이라고 생각합니다. –

+0

나는 IE 자신을 스트럿하고있어 시작할 시간이 충분하다. 나는 더 많은 것을 내일 시도 할 것이다. 그러나 잠이 "새로운 ShellWindowsClass()"다음에 오는 것처럼 그것은 생각된다. 나는 VS 디버거의 효과에별로 좋지 않다.하지만 거기에서 코드를 실행하고 중단 점에서 기다릴 때 Thread.Sleep을 가지지 않으면 같은 문제가 발생한다. 어쩌면 디버거가 다른 것을 소개하고 있지만, 지금 당장은 어떤 이유로 든 스레드를 잠자는 것이 새로운 ShellWindowsClass()를 끝내는 유일한 방법이라고 생각합니다. –

답변

5

나는 백업 보인다 다음 링크를 통해 온 한스의 코멘트 : http://weblogs.asp.net/joberg/archive/2005/05/03/405283.aspx

기사 상태 :

인터넷은 라이브러리 제어는 B이다 "ShellWindowsClass을" 을 포함 유익하게 모든 쉘 윈도우 (예 : IE)의 모음은 을 바탕으로 생성되었습니다. 해당 구성 요소 은 이라는 "Windows Registered"라는 이벤트 핸들러를 제공하며 을 연결합니다. 프로세스가 실행 된 후 이 실행되면 해당 창이 등록 될 때까지 대기합니다. 그러면 Internet Explorer 제어를 창에 연결합니다. 창이 발견되었는지 확인하려면 등록 된 창 을 반복하고 핸들을 찾으십시오. 이전에 실행 한 프로세스의 과 일치하는 핸들을 찾습니다. "ManualResetEvent" 동기 프리미티브를 사용하여 창이 등록 될 때까지 일정한 시간 동안 대기합니다.

이러한 아이디어를 문제에 상대적으로 쉽게 매핑 할 수 있기를 기대합니다.

+0

David - 내일 찾은 기사로 무언가를하려고 노력할 것입니다. 그것은 유망 해 보입니다. 나는 결과를 게시 할 것이다. –

+0

@user 행운을 빌어 요 !! –

+0

이 기사는 트릭을 수행했습니다. 감사! 내가 답변 게시물에 필요한 기사가 아닌 수정 내용을 보여 드리겠습니다. –

2

게시 한 기사 David 님이 문제를 해결했습니다. 코드가 내 프로그램에서 처음 실행되면 기사에서 설명한대로 작동합니다. 그러나 프로그램을 종료하면 열린 IE8을 열어두고 내 프로그램을 다시 연 다음 windows_WindowRegistered 메서드에 InvalidCastExceptions에 문제가 발생합니다. 아래 표시된 것처럼 이러한 예외를 처리하면 필요에 따라 작동합니다.

예제 코드 :

private void windows_WindowRegistered(int lCookie) 
{ 
    if (process == null) 
     return; // This wasn't our window for sure 

    for (int i = 0; i < windows.Count; i++) 
    { 
     try 
     { 
      InternetExplorerLibrary.InternetExplorer ShellWindow = windows.Item(i) as InternetExplorerLibrary.InternetExplorer; 
      if (ShellWindow != null) 
      { 
       IntPtr tmpHWND = (IntPtr)ShellWindow.HWND; 
       if (tmpHWND == process.MainWindowHandle) 
       { 
        IE = ShellWindow; 
        waitForRegister.Set(); // Signal the constructor that it is safe to go on now. 

        return; 

       } 
      } 
     } 
     catch (InvalidCastException ice) 
     { 
      //Do nothing. Browser.HWND could not execute for this item. 
     } 
    } 
} 
+0

+1 다른 독자의 이익을 위해 후속 조치를 보내 주셔서 감사합니다. 그리고 당신은 지금 upvote에 충분한 명성을 가지고 있습니다! –

관련 문제