我不想在SHDocVw.ShellWindows中使用Thread.Sleep

Håk*_*son 4 c# winapi internet-explorer

我有一个程序,我必须从正在运行的IE8进程中获取SHDocVw.InternetExplorer实例.要获取实例,下面的示例代码将运行.出于某种原因,没有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.  
      }  
}          
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

我发现以下链接似乎支持Hans的评论:http://weblogs.asp.net/joberg/archive/2005/05/03/405283.aspx

文章指出:

Internet控件库包含"ShellWindowsClass",它基本上是在桌面上生成的所有shell窗口(例如:IE)的集合.该组件提供了一个名为"Windows Registered"的事件处理程序,我们将与之挂钩.一旦启动过程,我们将等到相应的窗口被注册,然后我们将把我们的Internet Explorer控件连接到找到的shell窗口.为了确定是否找到窗口,我们遍历已注册的窗口,我们尝试找到一个匹配我们之前启动的进程句柄的句柄.我们将使用"ManualResetEvent"同步原语等待一定的时间来注册窗口.

我希望您能够相对轻松地将这些想法映射到您的问题中.