2014-01-15 118 views
5

該操作系統是在視網膜Macbook PRO上的Windows 8。WPF - 兩個手指在Macbook pro觸控板上水平滾動

我需要支持垂直滾動使用觸控板和水平滾動在我的應用程序。

我想移動WPF滾動查看器的位置基於兩個手指輕掃上下(垂直滾動)和左 - 右(水平滾動)。

據我所見,觸控板上的垂直滾動被轉換爲框架中的鼠標滾輪事件。但是,我發現無法識別鼠標滾輪事件是否爲水平滾動。

我應該在WPF中處理什麼事件才能實現?

回答

0

我寫了一篇文章,特別爲您瞭解如何在WPF應用程序中處理觸控板的水平滾動。也就是說Support Horizontal Scrolling of TouchPad in WPF Application - walterlv


我們需要從我們的WPF窗口取WM_MOUSEHWHEEL消息。是!那個鼠標滾輪消息。我們之前從中獲取垂直數據,但我們現在從中獲取水平數據。

首先,我們應該掛鉤窗口消息。

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方法編寫水平滾動代碼。

更好的是,您可以將上述所有代碼打包到更常見的類中,並提高MouseTilt事件,就像提高MouseWheel事件一樣。