gpt4 book ai didi

C# - 在 WebBrowser 控件中捕获 CTRL 鼠标滚轮

转载 作者:行者123 更新时间:2023-11-30 21:19:00 45 4
gpt4 key购买 nike

我正在使用 C# 开发一个 Windows 窗体应用程序,其中嵌入了 WebBrowser 控件以“防伪”(即禁用上下文菜单、后退按钮、自由导航等)访问第三个-派对网络应用程序。

现在我正在尝试将缩放功能添加到我的自定义浏览器中。我有适合它的键盘组合(CTRL + 和 CTRL - 对底层 ActiveX WebBrowser 对象进行正确的 OLE 调用),但在我不得不处理的关于 WebBrowser 的其他令人沮丧的事情中,我似乎无法弄清楚如何像 IE 一样捕获 CTRL 鼠标滚轮来模拟缩放功能。我到处寻找解决方案,但无济于事。

为了解决这个问题,我创建了一个只有 WebBrowser 控件的空表单,并找到了以下内容:

<醇>
  • CTRL-MouseWheel 总是在父窗体具有焦点并且鼠标光标悬停在窗口顶部(例如应用程序的标题上)或鼠标悬停时触发 MouseWheel 事件光标悬停在 WebBrowser 控件上,但它似乎没有焦点,即使父窗体有焦点。
  • 当鼠标光标悬停在 WebBrowser 控件上并且 WebBrowser 具有焦点时,CTRL-MouseWheel 永远不会触发 MouseWheel 事件,并且似乎没有效果。
  • 在没有 CTRL 的情况下使用鼠标滚轮滚动 WebBrowser 的窗口内容,但在垂直滚动条完全到达顶部或底部之前不会触发 MouseWheel 事件.
  • 通过覆盖示例类的 WndProcDefWndProc 拦截 WM_MOUSEWHEELMessageWebBrowser 继承,父表单仅适用于上述条件(wParam 正确表示 MK_CONTROL)。
  • PreviewKeyDown 事件在按下 CTRL 时触发,正如预期的那样,但仍然与鼠标滚轮不一致。
  • 所以我猜 Message 正在父表单和托管控制级别下处理,不会冒泡到我可以拦截甚至处理它的地方。有没有办法做到这一点,或者有其他方法可以使用 CTRL-MouseWheel 模拟放大和缩小?

    感谢阅读!

    最佳答案

    首先将 WebBrowser.Document.DomDocument 转换为 mshtml 命名空间中的正确接口(interface),如 mshtml.HTMLDocumentEvents2_Event,然后您可以处理(和取消)鼠标滚轮事件。我不确定,但我认为您需要在文档更改时连接事件处理程序,所以我在 WebBrowser.DocumentCompleted 事件上执行此操作。我也不确定您是否需要释放任何 COM 对象。

    这已经够令人沮丧的了,我让它开始工作并不再关心......

    这里至少有一份解释基础知识的文档:How to handle document events in a Visual C# .NET application

    对于您的具体情况,只需根据 CTRL 键是否被按下,有条件地压缩 onmousewheel 事件。

    private void webBrowser_DocumentCompleted(object sender,
    WebBrowserDocumentCompletedEventArgs e)
    {
    if (webBrowser.Url.ToString() == "about:blank")
    return;
    var docEvents = (mshtml.HTMLDocumentEvents2_Event)webBrowser.Document.DomDocument;
    docEvents.onmousewheel -= docEvents_onmousewheel; //may not be necessary?
    docEvents.onmousewheel += docEvents_onmousewheel;
    }

    bool docEvents_onmousewheel(mshtml.IHTMLEventObj pEvtObj)
    {
    if (pEvtObj.ctrlKey)
    {
    pEvtObj.cancelBubble = true; //not sure what this does really
    pEvtObj.returnValue = false; //this cancels the event
    return false; //not sure what this does really
    }
    else
    return true; //again not sure what this does
    }

    现在,如果您需要了解 Wheel Delta(滚动量),您需要将事件对象转换为另一个接口(interface)。

    bool docEvents_onmousewheel(mshtml.IHTMLEventObj pEvtObj)
    {
    var wheelEventObj = (mshtml.IHTMLEventObj4)pEvtObj;
    var delta = wheelEventObj.wheelDelta;
    [...]
    }

    关于C# - 在 WebBrowser 控件中捕获 CTRL 鼠标滚轮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3971675/

    45 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com