2013-01-12 46 views
8

我想制作一个应用程序,当用户触摸他的屏幕时显示自己。它不应该用于点击。我在Windows 7/8中查找了触摸hanlders。但是,我看到每个触摸窗口必须RegisterTouchWindow如何全局检测敲击(触摸输入)而不是鼠标点击?

TL登记; DR

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

回答

9

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

据我所知,有几种方法可以通过一些限制来达到目的。上

  1. This article here作品两个运7 & 8.但需要的厂商ID和所述触摸屏的产品ID。您的应用程序有可能无法使用某些触摸设备正常工作。

  2. 在Win 8上使用RegisterPointerInputTarget。从我的调试中,windows 8 touch机制有其独特的特点。在触摸和触摸之间,所有触摸事件都将发送到接收第一个触摸事件的窗口,而不管窗口是最小化还是被其他窗口覆盖,或者在其后一个时间段中设置WS_EX_TRANSPARENT属性。如果第一个按钮被破坏,则一个按下和释放之间的触摸事件只能共享到另一个窗口。使用这个API,所有的触摸事件将被发送到注册窗口。在注册窗口调用UnregisterPointerInputTarget之前,其他窗口不能再接收触摸事件,或者使用InjectTouchInput将触摸输入注入到系统中。 “注册输入目标注入的输入不会被拦截。”请注意,使用此API需要UI访问权限。样本可以在here中找到。

  3. Windows挂钩。对于Win 7/8上的桌面应用程序,可以通过使用SetWindowsHookEx与WH_CALLWNDPROC或WH_GETMESSAGE轻松挂钩触摸事件。对于Win 8上的地铁应用程序,只能在窗口的消息循环中检测到第一个指针事件。尽管可以通过点击或点击来发生指示器事件,但是GetPointerType可以告诉您它是否是触摸指示器或鼠标指示器。使用钩子的样本可以在here找到。

处理指针事件的代码段:

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; 
... 
+0

感谢您的帮助。你有没有上面的例子? – blez

+0

我添加了一个链接和使用Windows钩子的代码片段。我不确定这些是否是您需要的示例。 – Luke

+0

Window Hook解决方案的FYI,在Windows 7上,对于WH_CALLWNDPROC和WH_GETMESSAGE钩子,它们都在另一个进程中运行,因此标准错误和标准输出没有按预期显示。相反,创建一个文件并登录到一个文件。并且在Windows 7上,似乎都没有得到WM_INPUT或WM_TOUCH。现在,我的原始输入只用作二进制文件,是触摸正在使用中或未使用任何触摸,在硬件鼠标处于活动状态时可以正常工作。感谢这篇文章。 – phyatt