lhi*_*ial 3 c# browser forms ctrl mousewheel
我正在用 C# 开发一个带有嵌入式WebBrowser控件的 Windows 窗体应用程序,以“防伪”(即禁用上下文菜单、后退按钮、自由导航等)访问第三方 Web 应用程序。
现在我正在尝试将缩放功能添加到我的自定义浏览器。我有键盘组合为它工作(CTRL + 和 CTRL - 对底层 ActiveX WebBrowser 对象进行正确的 OLE 调用),但在WebBrowser我不得不处理的其他令人沮丧的事情中,我似乎无法弄清楚如何像 IE 一样捕捉 CTRL-鼠标滚轮来模拟缩放功能。我到处寻找解决方案,但无济于事。
为了弄清楚,我创建了一个空表单,其中只有 WebBrowser 控件,并发现以下内容:
MouseWheel当父窗体具有焦点并且鼠标光标悬停在窗口顶部(例如应用程序的标题上)时,或者当鼠标光标悬停在WebBrowser控件上时,当控件未出现时,CTRL-MouseWheel 始终会触发该事件即使父窗体有焦点,也要有焦点。MouseWheel当鼠标光标悬停在WebBrowser控件上并WebBrowser具有焦点时,CTRL-MouseWheel 永远不会触发该事件,并且似乎没有效果。WebBrowser但MouseWheel在垂直滚动条完全到达顶部或底部之前不会触发事件。
Message对于从父窗体继承的示例类和从父窗体继承的示例类和WM_MOUSEWHEEL通过覆盖拦截for仅适用于上述条件(正确表示)。WndProcDefWndProcWebBrowserwParamMK_CONTROLPreviewKeyDown正如预期的那样,按下 CTRL 时会触发该事件,但仍不与鼠标滚轮一起执行任何操作。所以我猜它Message是在父窗体和托管控件级别下处理的,并且不会冒泡到我可以拦截甚至处理它的地方。有没有办法做到这一点,或者使用 CTRL-MouseWheel 模拟放大和缩小的其他方法?
谢谢阅读!
首先将WebBrowser.Document.DomDocument转换为 mshtml 命名空间中的正确接口,例如mshtml.HTMLDocumentEvents2_Event,然后您可以处理(和取消)鼠标滚轮事件。我不确定,但我认为您需要在文档更改时连接事件处理程序,所以我在WebBrowser.DocumentCompleted事件中执行此操作。我也不确定您是否需要释放任何 COM 对象。
这令人沮丧,以至于我开始工作并不再关心......
这里至少有一个文档解释了基础知识:How to handle document events in a Visual C# .NET application
对于您的特定情况,只需onmousewheel根据是否CTRL按下键来有条件地压缩事件。
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
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您需要知道 Wheel Delta(滚动量),您需要将事件对象投射到另一个界面。
bool docEvents_onmousewheel(mshtml.IHTMLEventObj pEvtObj)
{
var wheelEventObj = (mshtml.IHTMLEventObj4)pEvtObj;
var delta = wheelEventObj.wheelDelta;
[...]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5406 次 |
| 最近记录: |