允许用户使用cefsharp浏览器通过鼠标滚轮进行缩放

问题描述 投票:0回答:3

我正在运行 cefsharp/75。我想使用 ctrl 键和鼠标滚轮打开缩放功能。我的事件处理程序从未被触发。如果按住 ctrl 并使用鼠标,屏幕将不会移动。所以控件内部有一些东西并处理事件。我是否缺少一个设置?

cefsharp chromium-embedded
3个回答
3
投票

我添加了鼠标和键盘缩放。在 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 一样


0
投票

在我的项目中使用

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);
}

0
投票

这是 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 控件之外的任何位置,然后才能再次缩放。

© www.soinside.com 2019 - 2024. All rights reserved.