【问题标题】:Getting input if the window is not active (Windows)如果窗口不活动,则获取输入 (Windows)
【发布时间】:2010-06-23 18:41:15
【问题描述】:

短版:

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

背景信息:

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

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

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

【问题讨论】:

  • 你能告诉我们更多关于你的输入系统的背景吗?您是否试图让两个应用程序相互通信?
  • 不,我目前正在开发一个小游戏,并想为其编写一个跨平台兼容的输入库。 (它也将在未来的游戏中使用。)当然,我可以只使用现有的库,但这样我会学到更多,最终我会得到我需要的东西。该库的界面在所有平台上都应该相同(它支持),因此我不想传递窗口句柄或类似的东西。而且我使用 SFML 来创建窗口,并且根本无法访问这些东西(或者我认为,我还不了解 SFML 的各个方面......)

标签: c++ c windows input


【解决方案1】:

选项:

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

【讨论】:

  • 感谢您的信息!我查看了 SetWindowsHookEx,似乎实际上不需要 DLL。它与 g_InputHookKeyboard = SetWindowsHookEx(WH_KEYBOARD, InputHookKeyboardProc, NULL, GetCurrentThreadId());在我的测试应用程序中。
  • 如果你只钩住属于你的进程的线程的事件就可以了。不过,要从其他进程的线程中获取事件,您需要 DLL。
【解决方案2】:

您需要设置 windows 键盘输入挂钩。 Here 是一个例子;在 C++ 中更容易实现

【讨论】:

  • 我一开始并没有看到这与我的问题有什么关系,但在进一步阅读之后,它变得清晰并且实际上相当有趣......你可以用钩子做什么样的事情很好:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2011-12-16
  • 2020-09-11
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多