我想制作一个在用户触摸他的屏幕时显示自己的应用程序。它不应该适用于点击。我在 Windows 7/8 中查找了触摸处理程序。但是我看到每个触摸窗口都必须用 RegisterTouchWindow 注册
TL;博士
有没有办法让我的窗口外的接触点位置(全局)?
Win 8 应用程序不再需要 RegisterTouchWindow。
据我所知,有几种方法可以实现您的目的,但有一些限制。
本文适用于 Win 7 和 8。但触摸屏的供应商 ID 和产品 ID 是必需的。您的应用程序可能无法在某些触摸设备上正常工作。
在Win 8上使用RegisterPointerInputTarget。从我的调试来看,windows 8的触摸机制有其独特的特点。在touch down和touch up之间,所有的touch事件都会被发送到第一个touch事件的window,无论是window被最小化还是被另一个window覆盖,或者在其后期设置WS_EX_TRANSPARENT属性。如果第一个被销毁,则只能将按下和释放之间的触摸事件共享到另一个窗口。使用此 API,所有的触摸事件都将发送到注册的窗口。直到注册的窗口调用UnregisterPointerInputTarget或使用InjectTouchInput将触摸输入注入回系统后,其他窗口才能接收到触摸事件. “注册的输入目标注入的输入不会被拦截。” 请注意,使用此 API 需要 UI 访问权限。可以在此处找到示例。
窗户挂钩。对于 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;
...