为什么不';t Application.DoEvents()允许WebBrowser控件进行处理
本文关键字:WebBrowser 允许 控件 处理 DoEvents Application 为什么不 | 更新日期: 2023-09-27 17:59:38
我使用C#和VS2012创建一个包含WebBrowser的应用程序。
每隔[x]秒不活动后,我希望我的应用程序导航回其主页(这是作为终端应用程序设计的)。原则上,这没有问题,但我偶然发现了一个边缘案例:
如果用户单击了某个调用的东西,例如JavaScript MessageBox,我的浏览器就会陷入"忙碌"状态。最终结果是,任何导航尝试都会以COM错误(0x800700AA)告终。
使用user32.dll SendMessage函数,我可以找到并关闭窗口。现在,如果我的函数到此结束,WebBrowser将继续处理调用窗口的任何脚本,并最终停止忙碌。这里是伪代码:
// This works so long as there isn't a dialog
private void NavigateHome(){
webBrowser.Navigate("http://www.google.com")
}
// This works to close the dialog and lets the browser return as not busy
private void NavigateHome(){
CloseWindows(); //Calls user32.dll
}
// This, again, works as long there isn't a dialog, otherwise the COM error returns
private void NavigateHome(){
CloseWindows(); //Calls user32.dll
webBrowser.Navigate("http://www.google.com")
}
// I thought this would be the solution, but the browser never continues processing
private void NavigateHome(){
CloseWindows(); //Calls user32.dll
while(webBrowser.isBusy){
Application.DoEvents();
}
webBrowser.Navigate("http://www.google.com")
}
现在,我想"正确"的解决方案是在关闭窗口后观看DocumentCompleted事件,但这感觉不太有弹性。最终,我并不真正关心文档——我只想回到我原来的页面。有人知道我该怎么做吗?
我也想知道为什么Application.DoEvents()不能像我预期的那样工作。
为了解决这个问题,我将"CloseWindow()"函数移到了后台工作线程中。然后,当WebBrowser(在GUI线程上)继续处理它需要处理的任何内容以返回不繁忙时,该线程可以等待。