使用LowLevelMouseProc捕获触摸事件不适用于所有应用程序

时间:2018-05-18 09:18:41

标签: c# touch setwindowshookex

tldr:我正在使用LowLevelMouseProc捕获触摸屏上的所有触摸事件。这适用于我的应用程序和一些其他应用程序,但遗憾的是并非所有应用程序。有人能解释我为什么吗?

完整的故事:

我有一个C#应用程序使用LowLevelMouseProc + SetWindowsHookEx来检测触摸屏上的触摸位置。 钩子允许我捕捉触摸屏上的所有触摸

  • 如果我的应用程序在前台
  • 用于Windows桌面(我的应用程序已最小化)
  • 对于某些应用,例如Visual Studio或Firefox

不幸的是,这种机制并不适用于所有应用,例如:它不会捕获谷歌浏览器覆盖的显示区域中的任何触摸。

  1. 这是否意味着,例如Google Chrome已经消耗了触摸事件,并且没有调用后续事件处理程序(包括我的钩子)?有人制作了similar observation?任何人都可以解释这种行为吗?
  2. 更新:触摸式挂钩甚至可以在Chrome中使用,但仅限于上下文菜单区域(例如,在右键单击网站时获得的弹出式窗口)。这可能支持Chrome消耗触摸事件的理论

    其他人强调要求LowLevelMouseProc回调在一个单独的DLL中。此外,其他人说,还要求外部应用程序和DLL具有相同的体系结构(x86,x64)。 See related post here

    1. 在我的项目中,所有触摸事件处理方法都在一个单独的DLL中。此外,回调有自己的线程。如上所述,这适用于某些应用程序,但不是全部,独立我的项目(* .exe + * .dll)是否编译为x86 / x64应用程序。
    2. 有趣的是,在捕获鼠标事件时,该钩子适用于所有应用程序,包括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. 此观察与问题(1)类似,可能意味着谷歌浏览器有自己的触摸挂钩,并且不会调用后续回调(可能出于安全原因?)。有人可以验证这个吗?

      2. 最终我有兴趣在前台捕获所有触摸事件,独立应用程序。有人知道更可靠的方法吗?

0 个答案:

没有答案