【问题标题】:Webbrowser steals focus网络浏览器抢了焦点
【发布时间】:2011-12-13 20:38:19
【问题描述】:

我在我的 winforms 应用程序 (c#) 中使用 webbrowser 控件。当它在做自动化的事情时,我正在使用我正在使用的窗口失去焦点控制。 Webbrowsers 的表单也没有出现,我只是失去了控制的焦点。我现在写这条消息我必须一次又一次地点击进入文本框......

如何在浏览器中禁用此类行为?

我像这样创建不可见的网络浏览器:

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

请指教。

【问题讨论】:

标签: c# .net winforms focus browser


【解决方案1】:

我遇到了同样的问题:

加载 URL 后,Webbrowser 控件会从应用程序中窃取焦点。

这对我有用:

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

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

让我知道它是否适合你。

【讨论】:

  • 可以只使用 Form.Activate() 和 Control.Focus() 方法来重新获得焦点。
  • Ravi 的方案更可靠。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我猜WebBrowser 在页面加载后通过调用Navigate(或HtmlElementClick 方法,这会导致导航)获得焦点。焦点可以在WebBrowserDocumentComplete事件处理程序中返回给窗口上的控件(TextBox),但这很困难:

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

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

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

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

    【讨论】:

    • 不幸的是,即使在另一个进程中运行,webcontrol 仍然会窃取焦点
    【解决方案4】:

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

    即使上面没有完全工作,应用程序窗口仍然会暂时弹出到前面,所以在当前处于前台的窗口上使用 SetWindowPos HWND_TOPMOST 和 HWND_NOTOPMOST 解决了这个问题。 HCBT_SETFOCUS 被击中 2 或 3 次,所以第一次设置 HWND_TOPMOST 和最后一次设置 HWND_NOTOPMOST。计算多少个 classname == "Internet Explorer_Server" 应该是 2(或者可能取决于网站?),另一个是 "Shell Embedding" 但并不总是发生。希望对您有所帮助。

    【讨论】:

      【解决方案5】:

      我正在查看这个问题的所有其他答案,但它们对我不起作用,但我看到了关于设置 Browser.Parent.Enabled = false; 的答案。我试过了,但出现了错误,所以我尝试了这个,而不是突然想到它。

      Browser.Parent = new Control();

      Browser.Parent.Enabled = false;

      现在问题完全消失了,它不再分散注意力。 我使用网络浏览器类作为变量,它不在我的表单上。 好吧,这对我有用,试试吧,这似乎是一个 100% 的解决方案。

      【讨论】:

        【解决方案6】:
        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);
            }
        

        【讨论】:

          【解决方案7】:

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

                  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
          

          【讨论】:

            猜你喜欢
            • 2010-09-20
            • 2012-02-27
            • 2018-04-02
            • 1970-01-01
            • 2015-09-16
            • 2012-10-30
            • 2013-03-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多