Webbrowser窃取焦点

我正在winforms app(c#)中使用webbrowser控件。 当它正在进行自动化操作时,我正在从我正在使用的窗口中失去焦点控制。 Web浏览器的forms也没有显示出来,我只是从控制中失去了焦点。 我现在写这条消息,我必须一次又一次地点击进入文本框……

如何在webbrowser中禁用此类行为?

我创建了这样的隐形web浏览器:

var br = new WebBrowser(); br.Visible = false; br.ScriptErrorsSuppressed = true; 

请指教。

我有同样的问题:

加载URL后,Web浏览器控件会从应用程序中获取焦点。

这对我有用:

  1. Webbrowser.Navigate()方法调用之前,将Webbrowser的父控件设置为Enabled = false
  2. 在Webbrowser的DocumentCompleted事件中,将Webbrowser的父控件重置为Enabled = true

您不能直接在Webbrowser上执行此操作,因为不支持WebBrowserBase.Enabled

请让我知道这对你有没有用。

您可以尝试通过SystemParametersInfo api全局禁用它。 使用SPI_SETFOREGROUNDLOCKTIMEOUT 。 设置前景锁定是全局设置,因此您需要在完成后清除此设置。 更永久的解决方案是更改HKCU \ Control Panel \ Desktop \ ForegroundLockTimeout注册表项。 另见关于social.msdn的讨论 (具体来说,是billb08的答案)。

我猜WebBrowser通过调用Navigate (或HtmlElementClick方法,导致导航)加载页面后获取焦点。 重点可以回到WebBrowserDocumentComplete事件处理程序中的窗口TextBoxTextBox ),但这非常困难:

  1. 您何时可以确定哪个控件最初拥有焦点? 在致电Navigate之前? 这还不够,因为用户可以在调用Navigate之后但在处理DocumentComplete之前移动到另一个控件。

  2. 将焦点设置为TextBox AFAIK将选择其整个内容,因此您必须将光标放回原始位置。 但是你什么时候存储原始位置? 同样的问题。

  3. 单个Navigate (或Click )后可以有多个DocumentComplete事件。

一种可能的解决方案是为隐藏的WebBrowser创建单独的应用程序。 第二个应用程序是不可见的,并且可以使用某些进程间通信(IPC)技术与原始GUI应用程序通信。 因为在这种情况下WebBrowser将在不同的进程中运行,所以您将有更好的机会不失去焦点并打扰用户。

这是一个非常复杂的问题需要修复,应该由微软修改,只是窃取焦点的应用程序不合逻辑,它确实取决于网站正在做什么。 我不得不求助于CBTfilter,请参阅http://msdn.microsoft.com/en-us/magazine/cc188966.aspx ,并过滤掉不需要的HCBT_ACTIVATE和HCBT_SETFOCUS(返回1;)。 您可以使用GetWindowClass(wParam)来查看正在发生的事情。

即使上面没有完全发挥作用,应用程序窗口仍会暂时弹出到前面,因此使用当前位于前台的窗口上的SetWindowPos HWND_TOPMOST和HWND_NOTOPMOST。 HCBT_SETFOCUS在第一组HWND_TOPMOST和最后一组HWND_NOTOPMOST上被击中2或3次。 计算多少classname ==“Internet Explorer_Server”应该是2(或者可能取决于网站?),另一个是“Shell嵌入”,但并不总是发生。 希望能帮助到你。

我正在查看这个问题的所有其他答案,但他们并没有为我工作,但我看到了一个关于设置Browser.Parent.Enabled = false; 我试过这样并且得到了一个错误,所以我尝试了这个而不是它只是浮现在脑海中。

Browser.Parent = new Control();

Browser.Parent.Enabled = false;

而现在问题已经完全消失了,它不会再带走焦点了。 我使用Web浏览器类作为变量,它不在我的表单上。 这对我有用,尝试一下,这似乎是100%的解决方案。

 Most of the methods won't work for me on more than one web browser. This method is work with any amount of web browsers; 1. Put web browser into a panel and set panel enabled to false, then navigate; webBrowser.Parent = panelBottom; panelWebBrowser.Enabled = false; webBrowser.Navigate("http://www.google.com"); 2. Define a navigated event to web browser and delay panels enabling for a second; private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e) { System.Threading.Timer timer = null; timer = new System.Threading.Timer((obj) => { panelWebBrowser.Enabled = true; timer.Dispose(); },null, 1000, Timeout.Infinite); } 

我将焦点发送回表单的解决方案:

  Private Sub Web_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles Web.DocumentCompleted If Me.Visible = False Then For Each f As Form In My.Application.OpenForms If TypeOf f Is frmLogin Then Dim fl As frmLogin = DirectCast(f, frmLogin) If fl.Visible = True Then fl.Focus() Exit For End If End If Next End If End Sub