表单应用程序未接收鼠标或键盘事件

时间:2013-11-28 03:55:36

标签: c# windows winforms .net-2.0

我有一个在客户端自助服务终端机器(Windows XP)上运行的C#.NET 2.0应用程序,偶尔会为用户输入提供一个窗口。另一个自助服务终端软件似乎在某种程度上干扰它,因为在它运行时我们的窗口将不会接收鼠标或键盘事件,尽管它是顶部窗口。当其他软件未运行时,所有工作都按预期进行。有没有人对这里可能发生的事情有任何见解?

由于

3 个答案:

答案 0 :(得分:2)

如果有疑问 - 请使用随Visual Studio提供的Spy ++来查看窗口从系统收到的消息。

如果其他应用程序阻止所有输入,则它不符合Win32 API。这就是为什么在Vista和更新的Win OS中引入低级挂钩超时的原因。这意味着一个进程将被踢出低级钩子链,如果它在调用CallNextHookEx()之前保持在一个钩子上太久,并且不再接收任何低级钩子消息。

在Windows XP上,没有这样的限制。进程可能需要花费尽可能多的时间来处理挂钩消息。另一个程序要么是越野车,要么是邪恶的。如果您的应用程序必须输入,那么只需以编程方式关闭另一个应用程序或联系其作者并解释其情况。

答案 1 :(得分:1)

经过一些挖掘后,其他窗体编程程序可能正在使用类似于此处http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx的低级键盘钩子。在关注该文章中的链接后,我看到了该代码段的摘要

  

有关这方面的具体示例,请考虑图4中的(错误)代码。使用低级键盘窗口挂钩,代码拦截发送到任何窗口的所有WM_KEYDOWN消息,并打印出相应的密钥。

来源:http://msdn.microsoft.com/en-us/magazine/cc163606.aspx

答案 2 :(得分:1)

看看这里

http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

使用全局键盘钩子应该很好,并且还包括一些源。此外,一些用户似乎通过使用ManagedSpyLib来解决类似的问题:

https://stackoverflow.com/a/8829286/1284902