我正在使用 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() 不能像我预期的那样工作。