12

我想制作一个在用户触摸他的屏幕时显示自己的应用程序。它不应该适用于点击。我在 Windows 7/8 中查找了触摸处理程序。但是我看到每个触摸窗口都必须用 RegisterTouchWindow 注册

TL;博士

有没有办法让我的窗口外的接触点位置(全局)?

4

1 回答 1

15

Win 8 应用程序不再需要 RegisterTouchWindow。

据我所知,有几种方法可以实现您的目的,但有一些限制。

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

  2. 在Win 8上使用RegisterPointerInputTarget。从我的调试来看,windows 8的触摸机制有其独特的特点。在touch down和touch up之间,所有的touch事件都会被发送到第一个touch事件的window,无论是window被最小化还是被另一个window覆盖,或者在其后期设置WS_EX_TRANSPARENT属性。如果第一个被销毁,则只能将按下和释放之间的触摸事件共享到另一个窗口。使用此 API,所有的触摸事件都将发送到注册的窗口。直到注册的窗口调用UnregisterPointerInputTarget或使用InjectTouchInput将触摸输入注入回系统后,其他窗口才能接收到触摸事件. “注册的输入目标注入的输入不会被拦截。” 请注意,使用此 API 需要 UI 访问权限。可以在此处找到示例。

  3. 窗户挂钩。对于 Win 7/8 上的桌面应用程序,可以通过使用带有 WH_CALLWNDPROC 或 WH_GETMESSAGE的SetWindowsHookEx轻松挂钩触摸事件。对于 Win 8 上的 Metro 应用程序,在窗口的消息循环中只能检测到第一个指针事件。虽然指针事件可以通过单击或点击来发生,但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;  
...
于 2013-01-13T15:18:21.103 回答