2012-10-19 42 views
2

我在Windows窗體中獲得了WebBrowser控件,我想用鼠標中鍵單擊將新選項卡添加到我的瀏覽器。唯一的問題是,每次我使用鼠標中鍵,箭頭移動頁面出現。取消激活鼠標中鍵在Windows瀏覽器中移動表格

那麼,如何禁用此移動/拖動命令僅用於點擊我的鏈接?

+2

這是最有可能您的鼠標驅動程序軟件的功能,檢查控制面板中的鼠標設置 –

+0

那麼,爲什麼Mozilla這樣做是正確的?嘗試一下,中間點擊一個鏈接,它會在新的背景標籤中打開,在瀏覽器的其他地方執行,您可以移動頁面。 –

回答

-1

單擊鼠標中鍵時顯示的移動圖標受鼠標設置的控制。但是您可以在您的WebBrowser控件上檢測鼠標中鍵。

註冊DocumentCompleted事件爲您WebBrowser控制和使用下面的代碼:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    webBrowser1.Document.MouseDown += Document_MouseDown; 
} 

void Document_MouseDown(object sender, HtmlElementEventArgs e) 
{ 
    if (e.MouseButtonsPressed == System.Windows.Forms.MouseButtons.Middle) 
    { 
     // code to add tab or do sth else 
    } 
} 
+1

問題不在於檢測鼠標中鍵按鈕事件,問題在於此移動光標出現。我想禁用它的一些行動,但不適合每個人。 –

1

試試這個: 有兩個不同的部分來此解決方案。第一個是很容易 - 只需設置一個事件處理程序爲您的瀏覽器控件的MouseDown事件:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
       { 
        if (webBrowser1.Document != null) 
        { 
         webBrowser1.Document.MouseDown += Document_MouseDown; 
        } 
       } 

private void Document_MouseDown(object sender, HtmlElementEventArgs e) 
      { 
       if (e.MouseButtonsPressed == System.Windows.Forms.MouseButtons.Middle) 
       { 
        e.ReturnValue = false; 

        // Your custom code 
       } 
      } 

,但也出現了一些關於此解決方案沒有工作的JavaScript重的網站。對於這些,我發現涉及注入的JavaScript到文檔中,這將防止在中間點擊另一種解決方案:

HtmlElement head = browser.Document.GetElementsByTagName("head")[0]; 
HtmlElement mscript = browser.Document.CreateElement("script"); 
IHTMLScriptElement element = (IHTMLScriptElement)mscript.DomElement; 
element.text = "function handleMouseEvent(e) { " 
       + "var evt = (e==null ? event:e); " 
       + "if (e.which == 2) e.preventDefault(); " 
       + "return true; } " 
       + "document.onmousedown = handleMouseEvent; " 
       + "document.onmouseup = handleMouseEvent; " 
       + "document.onclick  = handleMouseEvent; "; 
head.AppendChild(mscript); 

UPDATE

的JavaScript注入方法可以按照建議的方式做改善它只使用託管代碼: stackoverflow.com/a/6222430/1248295

這是javascript注入的另一個示例實現,在VB.NET中寫道:

 Private ReadOnly handleMouseEventJs As String = 
" 
function HandleMouseEvent(e) { 
    var evt = (e==null ? event:e); 
    if (e.which == 2) e.preventDefault(); 
    return true; 
} 

document.onmousedown = HandleMouseEvent; 
// These events below seems are not necessary to handle for this purpose. 
// document.onmouseup = HandleMouseEvent; 
// document.onclick = HandleMouseEvent; 
" 

Private Sub WebBrowser1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) _ 
Handles WebBrowser1.Navigated 

    Dim wb As WebBrowser = DirectCast(sender, WebBrowser) 
    Dim doc As HtmlDocument = wb.Document 
    Dim head As HtmlElement = doc.GetElementsByTagName("head")(0) 
    Dim js As HtmlElement = doc.CreateElement("script") 
    js.SetAttribute("text", handleMouseEventJs) 
    head.AppendChild(js) 

    ' This method call seems not necessary at all, it works fine without invocking it. 
    ' doc.InvokeScript("HandleMouseEvent", Nothing) 

End Sub 

更新2

注入的代碼來代替:

document.body.onmousedown = function(e) { if (e.button === 1) return false; } 

https://stackoverflow.com/a/30423534/1248295

+0

非常棒,謝謝。但我不再在這個項目上工作。希望它可以幫助其他人。 –

+0

第一個解決方案不起作用,至少對於我嘗試過的網站,處理** HtmlDocument **/** HtmlElement **類** MouseDown **,** MouseUp **和**點擊**事件全部a ** e.ReturnValue = false **它只是沒有任何意義。 – ElektroStudios

+0

第二個解決方案無法按預期工作。注入JS代碼後,它會禁用網頁拖動funcionality,這是我們想要避免的,但它不適用於所有html元素,我仍然可以用中間按鈕點擊網頁中的某些按鈕,並拖動頁面。 – ElektroStudios

相關問題