Webbrowser窃取焦点

时间:2011-12-13 20:38:20

标签: c# .net winforms focus browser

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

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

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

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

请告知。

7 个答案:

答案 0 :(得分:15)

我遇到了同样的问题:

Webbrowser Control会在加载URL后从应用程序中获取焦点。

这对我有用:

  1. Webbrowser.Navigate()方法调用之前,将Web浏览器的父控件设置为Enabled = false
  2. 在Webbrowser的DocumentCompleted事件中,将Web浏览器的父控件重置为Enabled = true
  3. 您无法直接在Webbrowser上执行此操作,因为不支持WebBrowserBase.Enabled

    让我知道它是否适合你。

答案 1 :(得分:2)

您可以尝试通过SystemParametersInfo api全局禁用它。使用SPI_SETFOREGROUNDLOCKTIMEOUT。设置前景锁定是全局设置,因此您需要在完成后清除此设置。更永久的解决方案是更改HKCU\Control Panel\Desktop\ForegroundLockTimeout注册表项。另请参阅social.msdn上的this discussion(特别是billb08的回答)。

答案 2 :(得分:2)

我猜WebBrowser通过调用Navigate(或导致导航的Click HtmlElement方法)加载页面后获得焦点。重点可以回到TextBox的{​​{1}}事件处理程序中窗口上的控件(DocumentComplete),但这非常困难:

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

  2. 将焦点设置为DocumentComplete的AFAIK将选择其整体 内容,所以你必须把光标放回原来的 位置。但是你什么时候存储原来的位置?同样的问题。

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

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

答案 3 :(得分:2)

这是一个非常复杂的问题需要修复,应该由微软修改,只是窃取焦点的应用程序不合逻辑,它确实取决于网站正在做什么。我不得不求助于CBT过滤器,请参阅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嵌入”,但并不总是发生。希望它有所帮助。

答案 4 :(得分:2)

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

Browser.Parent = new Control();

Browser.Parent.Enabled = false;

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

答案 5 :(得分:0)

 argv = {
           "test",
           "--datadir=" & Replace(App.Path, "\", "/") & "/sql/data",
           "--basedir=" & Replace(App.Path, "\", "/") & "/sql",
           "--no-defaults",
           "--skip-networking"
       }     

  groups   = {
                "embedded",
                "server",
                "test_SERVER"
             }

 if mysql_server_init ( argc , argv , groups ) then
       mysql = mysql_init(0)   <==  Causing problem [ pic error message]
 else
     MsgBox "Init not Done".
 end if

答案 6 :(得分:0)

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

        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