Csharp/C#教程:如何全局检测点击(触摸输入)而不是鼠标点击?分享


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

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

TL; DR

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

对于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可以告诉您它是触摸指针还是鼠标指针。 使用钩子的样品可以在这里找到。

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

上述就是C#学习教程:如何全局检测点击(触摸输入)而不是鼠标点击?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

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

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1023779.html

(0)
上一篇 2022年1月7日
下一篇 2022年1月7日

精彩推荐