如何全局检测点击(触摸输入)而不是鼠标点击?

ble*_*lez 10 .net c# winapi touch windows-8

我想创建一个在用户触摸屏幕时显示自己的应用.它不适用于点击.我在Windows 7/8中寻找触摸手柄.但是我看到每个触摸窗都必须在RegisterTouchWindow中注册

TL; DR

有没有办法让触摸点位置在窗口外(全局)?

Luk*_*uke 13

对于Win 8应用程序,不再需要RegisterTouchWindow.

据我所知,有几种方法可以达到你的目的,但有一些限制.

  1. 本文适用于Win 7和8.但是需要供应商ID和触摸屏的产品ID.您的应用程序可能无法与某些触摸设备一起正常工作.

  2. 在Win 8上使用RegisterPointerInputTarget.从我的调试中,windows 8 touch机制有其独特的特性.在触摸和触摸之间,所有触摸事件将被发送到接收第一触摸事件的窗口,无论窗口被最小化还是被另一个窗口覆盖,或者在其后期设置WS_EX_TRANSPARENT属性.一个按下和释放之间的触摸事件只有在第一个窗口被破坏时才能共享到另一个窗口.使用此API,所有触摸事件都将发送到已注册的窗口.其他窗口无法再接收触摸事件,直到注册窗口调用UnregisterPointerInputTarget,或者使用InjectTouchInput将触摸输入注入系统."注册输入目标注入的输入不会被拦截." 请注意,使用此API需要UI Access权限.可在此处找到样本.

  3. Windows钩子.对于Win 7/8上的桌面应用程序,可以使用带有WH_CALLWNDPROC或WH_GETMESSAGE的SetWindowsHookEx轻松连接触摸事件.对于Win 8上的metro app,只能在窗口的消息循环中检测到第一个指针事件.虽然可以通过单击或点击来发生指针事件,但GetPointerType可以告诉您它是触摸指针还是鼠标指针.使用钩子的样品可以在这里找到.

用于处理指针事件的代码片段:

switch(Msg)  
{  
...  
case WM_POINTERENTER:  
case WM_NCPOINTERDOWN:  
case WM_NCPOINTERUP:  
case WM_NCPOINTERUPDATE:  
case WM_POINTERACTIVATE:  
case WM_POINTERCAPTURECHANGED:  
case WM_POINTERDOWN:  
case WM_POINTERLEAVE:  
case WM_POINTERUP:  
case WM_POINTERUPDATE:  
    {  
        UINT32 pointerId = GET_POINTERID_WPARAM(wParam);  
        POINTER_INPUT_TYPE pointerType;  

        if (GetPointerType(pointerId, &pointerType))  
        {
            if (pointerType == PT_TOUCH)   
            {  
                ...  
            }  
        }  
    }  
    break;  
...
Run Code Online (Sandbox Code Playgroud)