我在Windows窗體中獲得了WebBrowser控件,我想用鼠標中鍵單擊將新選項卡添加到我的瀏覽器。唯一的問題是,每次我使用鼠標中鍵,箭頭移動頁面出現。取消激活鼠標中鍵在Windows瀏覽器中移動表格
那麼,如何禁用此移動/拖動命令僅用於點擊我的鏈接?
我在Windows窗體中獲得了WebBrowser控件,我想用鼠標中鍵單擊將新選項卡添加到我的瀏覽器。唯一的問題是,每次我使用鼠標中鍵,箭頭移動頁面出現。取消激活鼠標中鍵在Windows瀏覽器中移動表格
那麼,如何禁用此移動/拖動命令僅用於點擊我的鏈接?
單擊鼠標中鍵時顯示的移動圖標受鼠標設置的控制。但是您可以在您的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
}
}
問題不在於檢測鼠標中鍵按鈕事件,問題在於此移動光標出現。我想禁用它的一些行動,但不適合每個人。 –
試試這個: 有兩個不同的部分來此解決方案。第一個是很容易 - 只需設置一個事件處理程序爲您的瀏覽器控件的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; }
非常棒,謝謝。但我不再在這個項目上工作。希望它可以幫助其他人。 –
第一個解決方案不起作用,至少對於我嘗試過的網站,處理** HtmlDocument **/** HtmlElement **類** MouseDown **,** MouseUp **和**點擊**事件全部a ** e.ReturnValue = false **它只是沒有任何意義。 – ElektroStudios
第二個解決方案無法按預期工作。注入JS代碼後,它會禁用網頁拖動funcionality,這是我們想要避免的,但它不適用於所有html元素,我仍然可以用中間按鈕點擊網頁中的某些按鈕,並拖動頁面。 – ElektroStudios
這是最有可能您的鼠標驅動程序軟件的功能,檢查控制面板中的鼠標設置 –
那麼,爲什麼Mozilla這樣做是正確的?嘗試一下,中間點擊一個鏈接,它會在新的背景標籤中打開,在瀏覽器的其他地方執行,您可以移動頁面。 –