tldr:我正在使用LowLevelMouseProc捕获触摸屏上的所有触摸事件。这适用于我的应用程序和一些其他应用程序,但遗憾的是并非所有应用程序。有人能解释我为什么吗?
完整的故事:
我有一个C#应用程序使用LowLevelMouseProc + SetWindowsHookEx来检测触摸屏上的触摸位置。 钩子允许我捕捉触摸屏上的所有触摸
不幸的是,这种机制并不适用于所有应用,例如:它不会捕获谷歌浏览器覆盖的显示区域中的任何触摸。
更新:触摸式挂钩甚至可以在Chrome中使用,但仅限于上下文菜单区域(例如,在右键单击网站时获得的弹出式窗口)。这可能支持Chrome消耗触摸事件的理论
其他人强调要求LowLevelMouseProc回调在一个单独的DLL中。此外,其他人说,还要求外部应用程序和DLL具有相同的体系结构(x86,x64)。 See related post here
有趣的是,在捕获鼠标事件时,该钩子适用于所有应用程序,包括Google Chrome。对于鼠标和触摸事件,使用相同的回调:
[StructLayout(LayoutKind.Sequential)]
public struct MSLLHOOKSTRUCT
{
public POINT pt;
public int mouseData;
public int flags;
public int time;
public UIntPtr dwExtraInfo;
}
...更多代码...
if (wParam == WM.MOUSEMOVE)
{
var info = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
var extraInfo = (uint)info.dwExtraInfo;
if ((extraInfo & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH)
{// Touch Move
Console.WriteLine("Touch move");
} else
{
Console.WriteLine("Mouse move");
}
}
这意味着,首先必须发生WM.MOUSEMOVE(= WM_MOUSEMOVE)事件。然后,代码通过查看info.dwExtraInfo来识别触摸/鼠标事件。
此观察与问题(1)类似,可能意味着谷歌浏览器有自己的触摸挂钩,并且不会调用后续回调(可能出于安全原因?)。有人可以验证这个吗?
最终我有兴趣在前台捕获所有触摸事件,独立应用程序。有人知道更可靠的方法吗?