2012-10-19 2 views
2

У меня есть элемент управления WebBrowser в форме Windows, и я хочу использовать среднюю кнопку мыши, чтобы добавить новую вкладку в свой браузер. Единственная проблема в том, что каждый раз, когда я использую среднюю кнопку мыши, стрелки для перемещения страницы появляются.Деактивировать среднюю кнопку мыши Перемещение в форме браузера Windows

Так как я могу отключить эту команду move/drag только для кликов по моим ссылкам?

+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

Это альтернативный пример реализация в яваскрипте инъекции, написал в 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 

UPDATE 2

Вводите этот код вместо:

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

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

+0

Довольно потрясающе, спасибо. Но я больше не работаю над этим проектом. Надеюсь, это поможет другим людям. –

+0

1-е решение не работает, по крайней мере, для сайтов, которые я пробовал, обработки ** HtmlDocument **/** HtmlElement ** classes ** MouseDown **, ** MouseUp ** и ** Нажмите ** события, все с a ** e.ReturnValue = false ** он просто ничего не делает. – ElektroStudios

+0

2-е решение не работает должным образом. После ввода кода JS да он отключает функцию перетаскивания веб-страницы, чего мы хотели избежать, однако она не работает для всех элементов html, я все же могу щелкнуть некоторые кнопки на веб-страницах со средней кнопкой, и она перетащит страницу , – ElektroStudios

Смежные вопросы