Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WPF使用什么来捕获鼠标和键盘输入?_.net_Wpf_Input_Hook_Mouse Hook - Fatal编程技术网

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

.net WPF使用什么来捕获鼠标和键盘输入?,.net,wpf,input,hook,mouse-hook,.net,Wpf,Input,Hook,Mouse Hook,我使用SetWindowsHookEx和WH\u mouse\u LL全局(系统范围)过滤某些鼠标点击。问题是它不适用于WPF应用程序(无论我是否指示系统忽略这些点击,所有WPF应用程序都会检测到鼠标点击)。我已经问了一个问题,但我假设WPF使用DirectInput而不是标准的Windows消息来检测输入。但这是真的吗 我已经找到了一个可以。如果可能的话,那么我认为这意味着WPF不使用DirectInput进行鼠标输入。但是,为什么不能阻止WPF应用程序使用SetWindowsHookEx检测

我使用
SetWindowsHookEx
WH\u mouse\u LL
全局(系统范围)过滤某些鼠标点击。问题是它不适用于WPF应用程序(无论我是否指示系统忽略这些点击,所有WPF应用程序都会检测到鼠标点击)。我已经问了一个问题,但我假设WPF使用
DirectInput
而不是标准的Windows消息来检测输入。但这是真的吗

我已经找到了一个可以。如果可能的话,那么我认为这意味着WPF不使用
DirectInput
进行鼠标输入。但是,为什么不能阻止WPF应用程序使用
SetWindowsHookEx
检测鼠标点击

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

例子 我很快创建了以下解决方案来重现奇怪的WPF行为。它包括3个项目:

  • 挂钩测试仪
    启动项目,自动启动其他两个项目,所以您应该主要关注这一个。启动时安装鼠标挂钩,关闭表单时卸载挂钩

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

  • WpfTest
    还包含一个文本框,带有自定义上下文菜单(尽管我也可以使用默认菜单),所以这里再次是测试鼠标右键的地方。只要HookTester正在运行,您就不能调用上下文菜单(使用鼠标右键),但由于某些原因,菜单仍将显示(为什么???)

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


下载SO5036143.ZIP:

即使您尝试设置过滤器,.NET Framework可能有一些未记录的API将WPF的过滤器置于高优先级,根本不允许您的过滤器执行,以确保WPF正常工作

WPF窗口与普通窗口相同,它们应该能够正确地与预先存在的输入API以及新的API一起工作,以便使WPF与远程桌面和其他类似软件一起工作

更新:

Windows钩子是在早期的Windows API中提供的,因为当时诸如事件冒泡和事件预览之类的概念不可用,对于此类实现钩子很有用。WPF已经提供了带有预览事件和冒泡事件的事件过滤,这就是可能不支持挂钩的原因

钩子不是API的标准部分,因为只有很少的应用程序使用它们。也许你可以在微软发布他们的过滤器不允许你的钩子过滤器的错误。

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

HwndMouseInputProvider处理诸如WM_MOUSEMOVE、WM_LBUTTONDOWN等消息。因此,我认为没有DirectInput用于处理鼠标和键盘输入。

如果它应该与预先存在的输入API正确工作,那么我认为它应该允许我的应用程序使用挂钩过滤输入,因为这是标准windows的预期行为。无论如何,这就是这个问题的意义所在——为了确定WPF正在使用什么,当我知道这些信息时,我可以安排我的应用程序正确过滤其他WPF应用程序中的输入(使用驱动程序、API挂钩等)。+1,感谢您提供的信息,但是我的问题仍然没有答案——我仍然想知道WPF使用什么来处理输入,因为可能还有一些解决方法可以让我达到我所需要的。谢谢,非常好的信息!但是,当WPF在标准windows消息周围使用包装器时,低级钩子怎么可能不起作用呢?它在任何非WPF应用程序中都能很好地工作,但是使用WPF的应用程序的行为不符合预期(我可以在WPF应用程序中正确地检测到鼠标事件,但我不能取消该事件,即使它在任何其他非WPF应用程序中都能工作)。也许你应该发布一个示例?顺便说一下,如果您想管理WPF输入,您应该查看InputManager类。谢谢。我发现你的WM_RBUTTONUP的常量值是错误的。它应该是0x205。并且WPF应用程序中将没有上下文菜单;)啊,谢谢。我很快创建了这个例子,所以在匆忙中我错过了这个(我使用不同的类和正确的WM_RBUTTONUP进行开发)。我做了进一步的测试,发现了问题所在——我使用带触笔的计算机进行开发,我认为系统只是将触笔输入转换成鼠标消息,就是这样(对于触笔不敏感的应用程序)。因此,它可以与标准的Win32应用程序正常工作(手写笔右键单击不起任何作用),但WPF应用程序仍然能够检测到这种单击,因为它们可以识别手写笔(不知道)。所以现在我需要像低电平手写笔挂钩这样的东西。不幸的是,我从来没有使用过手写笔,也没有触摸屏来测试WPF手写笔的行为。但我可以告诉你,它的工作原理非常有趣!HwndStylusInputProvider仅处理WM_TABLET_FLICK和WM_TABLET_QUERYSYSTEMGESTURESTATUS a