首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Windows浏览器窗体中停用鼠标中键移动

在Windows浏览器窗体中停用鼠标中键移动
EN

Stack Overflow用户
提问于 2012-10-20 00:02:30
回答 2查看 873关注 0票数 2

我在Windows窗体中获得了一个WebBrowser控件,我希望使用鼠标中键单击将新选项卡添加到我的浏览器中。唯一的问题是,每次我使用鼠标中键时,移动页面的箭头都会出现。

那么,我如何才能仅对我的链接上的点击禁用此移动/拖动命令呢?

EN

回答 2

Stack Overflow用户

发布于 2017-05-03 22:29:59

试试这个:这个解决方案有两个不同的部分。第一种方法非常简单-只需为浏览器控件的MouseDown事件设置一个事件处理程序:

代码语言:javascript
运行
复制
 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注入到文档中,这将防止鼠标中键点击:

代码语言: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);

更新

通过遵循仅使用托管代码执行此操作的建议方法:stackoverflow.com/a/6222430/1248295,可以改进JavaScript注入方法

这是用VB.NET编写的javascript注入的另一个示例实现:

代码语言:javascript
运行
复制
        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

改为注入以下代码:

代码语言:javascript
运行
复制
document.body.onmousedown = function(e) { if (e.button === 1) return false; }

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-20 03:41:59

鼠标中键单击时显示的移动图标受鼠标设置的控制。但是你可以检测到鼠标中键点击你的WebBrowser控件。

WebBrowser控件注册DocumentCompleted事件并使用以下代码:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12978130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档