0

现在,我一直在尝试创建与 Push-To-Talk 语音聊天应用程序类似的功能,但到目前为止,我找不到任何合适的解决方案。我没有使用 MFC 或 CLR。

问题很简单。我的窗口通常应该没有焦点(即最小化等),但我需要对按键做出反应(基本上,我什至不想知道按钮是否被按住)。不幸的是,WM_KEYDOWN 仅在窗口具有键盘焦点时才有效。我确实知道,例如 Teamspeak 为此使用 DirectInput,但我也知道没有它也绝对可以完成,这是我非常喜欢的。

我可以使用的唯一其他解决方案是使用 GetAsyncKeyState 进行轮询,但看起来这也不是一个好的解决方案。如果可能的话,我仍然更喜欢使用 Windows 消息。

4

2 回答 2

2

可以使用RegisterHotKey或使用全局低级键盘挂钩来解决该问题。

RegisterHotKey(Cody Gray 在推荐中建议)可能是这里更合适的选择。

于 2011-03-10T12:03:26.070 回答
0

我同意乔恩的观点。使用 user32.dll 和 RegisterHotKey 函数。非常有用的示例代码位于:https ://www.codeproject.com/kb/cs/kiosk_cs.aspx?display=print

如果像我最初那样,代码看起来完全是乱码并且您不知道该怎么做,请观看教程:https ://www.youtube.com/watch?v=qQWqGOaZiFI它们非常有用!

如果您尝试注册系统热键:但是请注意,第一个链接中的代码将返回错误,具体取决于您尝试注册的系统热键。我的问题突出了这个问题:如何在 user32.dll 中禁用系统热键?(目前未解决)。如果您尝试覆盖系统热键,那里还有一个代码编辑将修复您将遇到的错误之一:

[DllImport("user32.dll", SetLastError = true)]

我确实设法阻止了Windows + E热键,但是Alt + F4Home + Right等其他热键没有被禁用并且会返回错误。

如果您不尝试覆盖系统热键,这对您来说应该不是问题。但是,如果您的某个热键无法注册,我建议您使用下面的代码来诊断您的代码。

Marshal.GetLastWin32Error()

^ 该行代码的完整上下文在第一个链接中!

于 2017-04-10T09:17:38.170 回答