2011-12-13 69 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