我正在运行 cefsharp/75。我想使用 ctrl 键和鼠标滚轮打开缩放功能。我的事件处理程序从未被触发。如果按住 ctrl 并使用鼠标,屏幕将不会移动。所以控件内部有一些东西并处理事件。我是否缺少一个设置?
我添加了鼠标和键盘缩放。在 init 部分订阅事件
cefBrowser.PreviewMouseWheel += CefBrowser_PreviewMouseWheel;
cefBrowser.KeyUp += CefBrowser_KeyUp;
我使用
PreviewMouseWheel
来避免缩放期间滚动 (e.Handled = true
)。
private void CefBrowser_PreviewMouseWheel(object sender, MouseWheelEventArgs e) {
if (Keyboard.Modifiers != ModifierKeys.Control)
return;
if (e.Delta > 0)
cefBrowser.ZoomInCommand.Execute(null);
else
cefBrowser.ZoomOutCommand.Execute(null);
e.Handled = true;
}
private void CefBrowser_KeyUp(object sender, KeyEventArgs e) {
if (Keyboard.Modifiers != ModifierKeys.Control)
return;
if (e.Key == Key.Add)
cefBrowser.ZoomInCommand.Execute(null);
if (e.Key == Key.Subtract)
cefBrowser.ZoomOutCommand.Execute(null);
if (e.Key == Key.NumPad0)
cefBrowser.ZoomLevel = 0;
}
所以现在 cef 缩放几乎像 chrome 一样
在我的项目中使用
CefSharp.WinForms.NETCore v114.2.120
,我能够使用 ChromiumWidgetNativeWindow
来处理
WM_MOUSEWHEEL
和 WM_MOUSEHWHEEL
WndProc 消息。
ChromiumRenderWidgetHandleFinder.TryFindHandle(browser, out var chromeWidgetHostHandle);
NativeWindow = new ChromiumWidgetNativeWindow(browser, chromeWidgetHostHandle);
NativeWindow.OnWndProc(Browser_WndProc);
这里是我处理滚动的地方,其中 delta 是滚轮的刻度数,向下滚动时为负值。
private bool Browser_WndProc(Message m)
{
if (m.Msg is not 0x020A or 0x020E) // Mouse wheel
return false;
if ((m.WParam & 0x0008) == 0) // Ctrl pressed
return false;
short delta = (short)((short)(m.WParam >> 16 & 0xFFFF) / 120);
ZoomLevel += zoomRate * delta;
return true;
}
ZoomLevel是我定义的一个属性,用于控制浏览器的缩放
public double ZoomLevel
{
get => _zoomLevel;
set => browser.SetZoomLevel(_zoomLevel = value);
}
private double _zoomLevel = 1d;
需要注意的是,如果在创建
ChromiumWebBrowser
实例后立即获取句柄,通常会失败。等到首页导航后,我得到了很好的结果。
browser.LoadUrl(url);
await browser.WaitForNavigationAsync();
if (NativeWindow is null)
{
ChromiumRenderWidgetHandleFinder.TryFindHandle(browser, out var chromeWidgetHostHandle);
NativeWindow = new ChromiumWidgetNativeWindow(browser, chromeWidgetHostHandle);
NativeWindow.OnWndProc(Browser_WndProc);
}
这是 CefSharp V.109 的 WinForms 解决方案:
为表单注册一个MouseEventHandler:
this.MouseWheel += new MouseEventHandler(this.OnMouseWheel);
private void OnMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
Control ctrl = FindControlAtCursor(this);
if (ctrl == null) return;
var zoomLevel = CefSharp.WebBrowserExtensions.GetZoomLevelAsync((ChromiumWebBrowser)ctrl).Result;
zoomLevel += e.Delta > 0 ? 0.1 : -0.1;
(ctrl as CefSharp.IWebBrowser).GetBrowser().GetHost().SetZoomLevel(zoomLevel);
}
它工作正常,除了一件事:执行缩放然后滚动页面后,您必须单击 CEF 控件之外的任何位置,然后才能再次缩放。