gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:05:20 27 4
gpt4 key购买 nike

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

长话短说

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

最佳答案

RegisterTouchWindow 不再是 Win 8 应用程序所必需的。

据我所知,有几种方法可以在有一定限制的情况下实现您的目的。

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

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

  3. Windows Hook 。对于 Win 7/8 上的桌面应用程序,可以使用 SetWindowsHookEx 轻松挂接触摸事件。使用 WH_CALLWNDPROC 或 WH_GETMESSAGE。对于 Win 8 上的 Metro 应用程序,在窗口的消息循环中只能检测到第一个指针事件。尽管单击或点击都可能发生指针事件,GetPointerType可以告诉您它是触摸指针还是鼠标指针。可以在 here 找到使用钩子(Hook)的示例。 .

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

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

关于c# - 如何全局检测点击(触摸输入)而不是鼠标点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com