1. 程式人生 > >使 WPF 支持觸摸板的橫向滾動

使 WPF 支持觸摸板的橫向滾動

block -h boa ram 蘋果 str water 相同 方式

原文:使 WPF 支持觸摸板的橫向滾動

版權聲明:本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:http://blog.csdn.net/wpwalter/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請與我聯系([email protected])。 https://blog.csdn.net/WPwalter/article/details/78619911

微軟終於開始學蘋果一樣好好做觸摸板了(就是鍵盤空格鍵下面那一大塊)

。然而鑒於以前沒有好好做,以至於 WPF 程序甚至都沒有對觸摸板的橫向滾動提供支持(豎向滾動是直接使用了 MouseWheel,汗……)。但有些功能真希望能夠支持橫向滾動!

本文將介紹讓觸摸板支持橫向滾動的方法,本質上也是用 MouseWheel,但卻支持了橫向。


本文同時編寫了 中文 和 英文 兩個版本,不過 CSDN 博客中我只發布了中文版本,英文版本需前往 GitHub:Support Horizontal Scrolling of TouchPad in WPF Application - walterlv。

技術分享圖片
▲ 精確式觸摸板

我們需要從 Windows 的窗口消息中獲取 WM_MOUSEHWHEEL

消息。對,就是鼠標滾輪消息!以前我們只取了縱向數據,現在我們要取橫向數據。

首先,我們需要能夠監聽得到消息才行。重寫 WindowOnSourceInitialized 方法可以開始監聽消息;如果代碼沒辦法寫到 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 支持觸摸板的橫向滾動