2011-12-13 41 views
4

我在我的Winforms应用程序(c#)中使用webbrowser控件。而当它做自动化的事情时,我正在失去与我合作的窗口的焦点控制。 Webbrowsers的形式也没有出现,我只是失去了控制的重点。我现在写这条消息,我必须再次点击进入文本框...Webbrowser窃取重点

如何禁用webbrowser中的这种行为?

我创造无形的web浏览器这样的:

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

请指教。

+2

您发布肯定的代码有绝对无关,与你所遇到的问题。如果您确定只有在运行程序时才会出现此问题,则需要为程序的其余部分发布更多代码。 – 2011-12-13 20:42:12

+0

[防止WebBrowser控制盗取焦点?](http://stackoverflow.com/questions/1562619/prevent-webbrowser-control-from-stealing-focus) – 2011-12-14 16:00:11

回答

14

我有同样的问题:

WebBrowser控件偷了应用热点,一旦URL被加载。

这为我工作:

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

你不能直接做它的Webbrowser因为WebBrowserBase.Enabled不支持。

让我知道它是否适合你。

2

我猜WebBrowser通过调用Navigate(或导致导航的HtmlElement的方法Click)加载页面后获取焦点。重点可以归还给在WebBrowserDocumentComplete事件处理程序的窗口(TextBox)上的控制,但这是非常困难的:

  1. 你什么时候会决定哪个拥有原本的焦点 ?在致电Navigate之前?这是不够的,因为 用户在拨打Navigate之后可以移动到另一个控件,但在 之前处理DocumentComplete

  2. AFAIK焦点设置为TextBox将选择其整个 内容,所以你必须把光标回到原来的位置 。但是,你什么时候会存储原始位置?同样的问题。 (或Click)后可以有多个DocumentComplete事件。

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

2

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

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

2

我在看这个问题的所有其他答案,他们不是为我工作,但我看到了一个关于设置Browser.Parent.Enabled = false;我试过了,得到了一个错误,所以我尝试了这个,只是想到了它。

Browser.Parent = new Control();

Browser.Parent.Enabled = false;

而现在的问题是完全消失了,它并没有带走关注了。 我使用网络浏览器类作为变量,它不在我的表单上。 以及这工作对我来说,这似乎是一个100%的解决方案。

0
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); 
    } 
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