WPF - Macbook pro 触控板上的两指水平滚动

2024-01-09

操作系统是 Retina Macbook PRO 上的 Windows 8。

我需要在我的应用程序中支持使用触控板的垂直滚动和水平滚动。

我想根据两个手指上下滑动(垂直滚动)和左右滑动(水平滚动)来移动 WPF 滚动查看器位置。

据我所知,触控板上的垂直滚动被转换为框架中的鼠标滚轮事件。但是,我发现无法识别鼠标滚轮事件是否是水平滚动。

我应该在 WPF 中处理哪些事件才能实现此目的?


我专门写了一篇文章让您了解如何在 WPF 应用程序中处理触摸板的水平滚动。那是WPF应用程序中支持触摸板水平滚动 - walterlv https://walterlv.github.io/post/handle-horizontal-scrolling-of-touchpad-en.html


我们需要获取WM_MOUSEHWHEEL来自我们的 WPF 窗口的消息。是的!那个鼠标滚轮消息。我们之前从中获取垂直数据,但现在我们从中获取水平数据。

首先,我们应该挂钩窗口消息。

protected override void OnSourceInitialized(EventArgs e)
{
    var source = PresentationSource.FromVisual(_board);
    ((HwndSource) source)?.AddHook(Hook);
}

private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    // Handle window message here.
    return IntPtr.Zero;
}

接下来,处理WM_MOUSEHWHEEL:

const int WM_MOUSEHWHEEL = 0x020E;

private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    switch (msg)
    {
        case WM_MOUSEHWHEEL:
            int tilt = (short) HIWORD(wParam);
            OnMouseTilt(tilt);
            return (IntPtr) 1;
    }
    return IntPtr.Zero;
}

/// <summary>
/// Gets high bits values of the pointer.
/// </summary>
private static int HIWORD(IntPtr ptr)
{
    var val32 = ptr.ToInt32();
    return ((val32 >> 16) & 0xFFFF);
}

/// <summary>
/// Gets low bits values of the pointer.
/// </summary>
private static int LOWORD(IntPtr ptr)
{
    var val32 = ptr.ToInt32();
    return (val32 & 0xFFFF);
}

private void OnMouseTilt(int tilt)
{
    // Write your horizontal handling codes here.
}

您可以在其中编写水平滚动代码OnMouseTilt method.

更好的是,您可以将上面的所有代码打包到一个更常见的类中,并提出一个MouseTilt事件就像筹集资金一样MouseWheel event.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF - Macbook pro 触控板上的两指水平滚动 的相关文章

随机推荐