我正在编写属于自动化系统一部分的代码。我想添加一个键盘钩子来提前结束测试,我通过使用 SetWindowHookEx 来做到这一点。
我的代码看起来很像这样:http://support.microsoft.com/kb/318804
这是我的 SetWindowsHookEx 调用:
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
现在,当我运行自动化时,自动化系统内的按键(来自 SendKeys)会触发键盘挂钩方法,但是当我手动敲击键盘时,它不会被触发。
如果有帮助的话,我可以分享更多代码,但它是一个更大系统的一部分。我很确定:
- 我的 SetWindowsHookEx 不正确,或者
- 自动化系统中的某些东西正在绕过我的键盘挂钩(但我真的不知道如何辨别)。
我编写了一个测试应用程序,它使用来自 microsoft.com 的示例代码来确定我的方法是否有价值(即它有效),但我在将其与自动化系统集成时遇到了麻烦。
任何有关如何确定问题所在的想法将不胜感激。
编辑:自动化线束中没有 SetWindowsHookEx 的其他实例。我不太清楚全局键盘挂钩的细微差别。线程和桌面。如果我添加一个全局键盘钩子,添加它的位置是否重要?
乔治·马马拉泽的文章在 C# 中处理全局鼠标和键盘挂钩如果应用程序在 CodeProject 上“在后台”,则该方法自 2004 年以来一直存在,经过多次修订,他仍然支持它并更新它:据我了解,他启动了他的项目,因为他无法在.NET,当应用程序在后台运行时,它可以工作,但后来发现您可以挂钩某些“较低级别”事件:以前的 Q318804 :现在 MSDN 文章修订了(?),说你可以挂钩 WH_KEYBOARD_LL.
或许,由于 George 的代码多年来经过了众多 C# 程序员的现场测试,并针对错误或问题进行了广泛的修改:他的代码对您来说可能有一些价值吗?在他的文章第 1 版“常见问题解答”中,他展示了使挂钩应用程序特定化而不是全局化的代码。
上面引用的 MSDN 文章提到......在允许挂钩低级事件的背景下,正如您所做的那样:
“低级挂钩过程被称为
在安装钩子的线程上。
低级钩子不需要
钩子程序可以在a中实现
DLL。”
假设:线程可能与您所观察到的现象有关吗?
我假设您已经完成并考虑了以下所有细节:MSDN:LowLevelKeyboardProc 函数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)