使 WPF 支持觸摸板的橫向滾動
版權聲明:本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:http://blog.csdn.net/wpwalter/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請與我聯系([email protected])。 https://blog.csdn.net/WPwalter/article/details/78619911
微軟終於開始學蘋果一樣好好做觸摸板了(就是鍵盤空格鍵下面那一大塊)
MouseWheel
,汗……)。但有些功能真希望能夠支持橫向滾動!
本文將介紹讓觸摸板支持橫向滾動的方法,本質上也是用 MouseWheel
,但卻支持了橫向。
本文同時編寫了 中文 和 英文 兩個版本,不過 CSDN 博客中我只發布了中文版本,英文版本需前往 GitHub:Support Horizontal Scrolling of TouchPad in WPF Application - walterlv。
▲ 精確式觸摸板
我們需要從 Windows 的窗口消息中獲取 WM_MOUSEHWHEEL
首先,我們需要能夠監聽得到消息才行。重寫 Window
的 OnSourceInitialized
方法可以開始監聽消息;如果代碼沒辦法寫到 Window
中,可以通過 Window.GetWindow(DependencyObject)
獲取到窗口實例後監聽它的 SourceInitialized
事件。如果拿不到這樣的時機,則只要在任何 SourceInitialized
之後的時機(比如 Loaded
)都可以寫下面方法內部的兩行代碼。
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)
{
// 在這裏添加消息的處理。
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>
/// 取指針所在高位數值。
/// </summary>
private static int HIWORD(IntPtr ptr)
{
var val32 = ptr.ToInt32();
return ((val32 >> 16) & 0xFFFF);
}
/// <summary>
/// 取指針所在低位數值。
/// </summary>
private static int LOWORD(IntPtr ptr)
{
var val32 = ptr.ToInt32();
return (val32 & 0xFFFF);
}
private void OnMouseTilt(int tilt)
{
// 這裏就是觸摸板橫向滾動的時機,參數是橫向滾動的數值,就像鼠標滾輪縱向滾動的數值一樣。
}
OnMouseTilt
中就可以寫我們觸摸板橫向滾動的處理代碼。
以上代碼都可以封裝成通用的方法,在 OnMouseTilt
中拋出一個類似於 MouseWheel
一樣的事件是非常好的選擇。
微軟的 Microsoft Sculpt Comfort Mouse 鼠標滾輪也是支持橫向滾動的,以上方法也可以支持。
使 WPF 支持觸摸板的橫向滾動