微软终于开始学苹果一样好好做触摸板了(就是键盘空格键下面那一大块)。然而鉴于以前没有好好做,以至于 WPF 程序甚至都没有对触摸板的横向滚动提供支持(竖向滚动是直接使用了 MouseWheel,汗……)。但有些功能真希望能够支持横向滚动!
本文将介绍让触摸板支持横向滚动的方法,本质上也是用 MouseWheel,但却支持了横向。
我们需要从 Windows
的窗口消息中获取 WM_MOUSEHWHEEL
消息。对,就是鼠标滚轮消息!以前我们只取了纵向数据,现在我们要取横向数据。
首先,我们需要能够监听得到消息才行。重写 Window
的 OnSourceInitialized
方法可以开始监听消息;如果代码没办法写到 Window
中,可以通过 Window.GetWindow(DependencyObject)
获取到窗口实例后监听它的 SourceInitialized
事件。如果拿不到这样的时机,则只要在任何 SourceInitialized
之后的时机(比如 Loaded
)都可以写下面方法内部的两行代码。
接下来,我们开始处理 WM_MOUSEHWHEEL
:
OnMouseTilt
中就可以写我们触摸板横向滚动的处理代码。
以上代码都可以封装成通用的方法,在 OnMouseTilt
中抛出一个类似于 MouseWheel
一样的事件是非常好的选择。
微软的 Microsoft Sculpt Comfort Mouse
鼠标滚轮也是支持横向滚动的,以上方法也可以支持。
但是,原文关于取 LOWORD
和 HIWORD
有问题,在 64 位系统上,反向滚动会造成 Arithmetic Overflow, 所以下面是修改后的代码:
下面一段代码是评论中t3brown的评论,可以获取鼠标所在位置的滚动视图并进行滚动,十分方便: