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)
我发现以下链接似乎支持Hans的评论:http://weblogs.asp.net/joberg/archive/2005/05/03/405283.aspx
文章指出:
Internet控件库包含"ShellWindowsClass",它基本上是在桌面上生成的所有shell窗口(例如:IE)的集合.该组件提供了一个名为"Windows Registered"的事件处理程序,我们将与之挂钩.一旦启动过程,我们将等到相应的窗口被注册,然后我们将把我们的Internet Explorer控件连接到找到的shell窗口.为了确定是否找到窗口,我们遍历已注册的窗口,我们尝试找到一个匹配我们之前启动的进程句柄的句柄.我们将使用"ManualResetEvent"同步原语等待一定的时间来注册窗口.
我希望您能够相对轻松地将这些想法映射到您的问题中.
归档时间: |
|
查看次数: |
1188 次 |
最近记录: |