2017-08-03 129 views
0

我已经找到了一种方法来听鼠标事件,但我真正想要的是触摸事件而不是鼠标。他们似乎共享相同的代码。有什么方法可以判断事件是否触摸而不是鼠标?由于如何从SetWindowsHookEx中区分触摸和鼠标事件在c#

[DllImport("user32.dll")] 
    static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc callback, IntPtr hInstance, uint threadId); 

    [DllImport("kernel32.dll")] 
    static extern IntPtr LoadLibrary(string lpFileName); 

    private delegate IntPtr LowLevelMouseProc (int nCode, IntPtr wParam, IntPtr lParam); 

    const int WH_MOUSE_LL = 14; 
    const int WM_KEYDOWN = 0x100; 

    private LowLevelMouseProc _proc = hookProc; 

    private static IntPtr hhook = IntPtr.Zero; 

    public void SetHook() 
    { 
     IntPtr hInstance = LoadLibrary("User32"); 
     hhook = SetWindowsHookEx(WH_MOUSE_LL, _proc, hInstance, 0); 
    } 

    public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam) 
    { 

     System.Diagnostics.Debug.Print("Param: " + wParam + ", CODE: " + code + "\n"); 
    } 

    private void Form1_Load(object sender, RoutedEventArgs e) 
    { 
     SetHook(); 
    } 

回答

1

lParam参数您hookProc回调是一个指向MSLLHOOKSTRUCT。它包含一个非常变量不明的dwExtraInfo变量,它告诉你它是否是从触摸产生的。

如果所有在0xFF515700位的dwExtraInfo设置,则回调是在响应调用触摸:

[StructLayout(LayoutKind.Sequential)] 
struct MSLLHOOKSTRUCT 
{ 
    public POINT pt; 
    public uint mouseData; 
    public uint flags; 
    public uint time; 
    public IntPtr dwExtraInfo; 
} 

const int TOUCH_FLAG = 0xFF515700; 
bool IsTouch(IntPtr lParam) 
{ 
    MSLLHOOKSTRUCT hookData = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, 
     typeof(MSLLHOOKSTRUCT)); 
    uint extraInfo = (uint)info.dwExtraInfo.ToInt32(); 
    if ((extraInfo & TOUCH_FLAG) == TOUCH_FLAG) 
     return true; 
    return false; 
} 
+0

你是最棒的! – user1865027

+0

顺便说一句,你如何使用多点触摸? – user1865027

+0

说我在屏幕上同时移动了两个以上的手指,我能打印出两个单独触摸的坐标吗? – user1865027