WPF用什么来捕获鼠标和键盘输入?

Pay*_*aya 16 .net wpf hook input mouse-hook

我全局(系统范围)使用SetWindowsHookEx和过滤某些鼠标点击WH_MOUSE_LL.问题是它不适用于WPF应用程序(所有WPF应用程序都检测鼠标点击,无论我是否指示系统忽略这些点击).我已经在这里问了一个类似的问题,但我假设WPF使用DirectInput而不是标准的Windows消息来检测输入.但是呢?

我已经能够找到一个能够使用鼠标点击进入WPF应用程序SendMessage的代码.如果这是可能的,那么我认为它意味着WPF不DirectInput用于鼠标输入.但是,为什么不能阻止WPF应用程序检测鼠标点击SetWindowsHookEx

虽然这个问题主要是关于鼠标输入,但我也想知道它对于键盘输入是如何工作的.

我已经快速创建了以下解决方案来重现奇怪的WPF行为.它由3个项目组成:

  • HookTester
    StartUp项目,自动启动其他2个项目,所以你应该主要关注这一个.启动时安装鼠标挂钩,并在关闭表单时卸载挂钩.

  • WinFormsTest
    包含一个带有默认上下文菜单的TextBox,您可以在其中测试鼠标右键.当HookTester运行时,您不能使用鼠标右键调用上下文菜单.

  • WpfTest也
    包含一个TextBox,带有自定义上下文菜单(虽然我也可以使用默认菜单),所以这又是测试鼠标右键的地方.只要HookTester正在运行,您就无法调用上下文菜单(使用鼠标右键),但出于某种原因,菜单仍将显示(Why ???).

警告:当您运行解决方案时,HookTester项目将启动并立即安装挂钩以拒绝任何右键鼠标点击(系统范围内).只需关闭HookTester表单即可轻松卸载挂钩.谨慎测试.

下载SO5036143.ZIP: 镜子1,镜子2

Mar*_*nov 11

  • WPF窗口创建HwndSource(Window.CreateSourceWindow).
  • HwndSource创建HwndWrapper(HwndSource.Initialize).
  • HwndWrapper使用窗口过程创建Win32窗口,该窗口过程将Windows消息委托给HwndSource指定的钩子.
  • 一个钩子是HwndSource.InputFilterMessage,它将Windows消息委托给四个输入提供者:手写笔,鼠标,键盘,appcommand.
  • Provider解析适当的Windows消息并调用InputManager来引发元素上的输入事件.

HwndMouseInputProvider处理消息,如WM_MOUSEMOVE,WM_LBUTTONDOWN等.所以我认为没有用于处理鼠标和键盘输入的DirectInput.

  • 不幸的是,我从未使用手写笔而且没有触摸屏来测试WPF手写笔的行为.但我可以告诉你,它的工作原理非常有趣!HwndStylusInputProvider仅处理WM_TABLET_FLICK和WM_TABLET_QUERYSYSTEMGESTURESTATUS并且不引发任何事件.还有另一个名为PenThreadWorker的类.它启动了一个名为"Stylus Input"的新线程.此线程使用名为"penimc.dll"的本机DLL中的GetPenEvent和GetPenEventMultiple函数查询输入事件.然后它会触发与互操作结果相对应的Stylus事件. (2认同)