如果窗口未处于活动状态,如何获取输入(Windows)

4

简短版:

当窗口不活跃时,如何使用C++/C在Windows中接收输入消息?

背景信息:

我正在开发一个输入系统,它不应依赖于任何窗口,因此可以在控制台中使用。

我的想法是创建一个仅接收消息的不可见窗口,使用HWND_MESSAGE作为hWndParent是可能的。但只有当它处于活动状态时才会接收输入消息,而我不希望这样。它应该始终接收输入(除非应用程序请求不再这样做,例如因为失去了焦点)。

我知道这是可能的,许多应用程序支持全局快捷键(例如媒体播放器(播放控制)或即时通讯软件(打开联系人列表)),我只是不知道怎么做。你知道吗?


你能告诉我们更多关于你的输入系统的背景吗?你是在尝试让两个应用程序相互通信吗? - Alerty
不,我目前正在开发一个小游戏,并希望为它编写一个跨平台兼容的输入库。(它将在未来的游戏中也会被使用。)当然,我可以直接使用现有的库,但这样我就无法学到更多知识,最终我只会得到我所需要的东西。该库的接口应该在所有支持的平台上保持一致,因此我不想传递窗口句柄之类的东西。 而且我使用SFML进行窗口创建,简单地说,我没有访问那些东西的权限(或者我认为是这样,我还不了解SFML的每个方面...) - Mr. Wonko
2个回答

2

选项:

  • 如果您只需要注册一个或几个热键,请使用RegisterHotKey
  • 如果您需要过滤大量或所有键盘事件,请使用SetWindowsHookEx和WH_KEYBOARD / WH_KEYBOARD_LL。但是,钩子代码需要在DLL中实现(该DLL被加载到其他进程中)。您需要32位和64位版本的DLL。

谢谢信息!我查看了SetWindowsHookEx,似乎DLL实际上并不是必需的。在我的测试应用程序中,使用以下代码就可以正常工作: g_InputHookKeyboard = SetWindowsHookEx(WH_KEYBOARD, InputHookKeyboardProc, NULL, GetCurrentThreadId()); - Mr. Wonko
1
如果只钩住属于您的进程的线程事件,那就没问题。不过,要从其他进程的线程中获取事件,则需要使用动态链接库(DLL)。 - peterchen

1

您需要设置Windows键盘输入钩子。这里提供了一个示例,展示如何实现;在C++中实现甚至更加容易。


起初我并不明白这与我的问题有什么关系,但进一步阅读后变得清晰,并且实际上非常有趣...使用钩子可以做出很多好玩的事情 :-) - Mr. Wonko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接