我正在制作一个程序,希望能够检测到按下F6键,然后调用if语句。这应该是全局有效的,不仅仅是在我的程序中。我该如何实现?
由于您在使用Windows系统,您可以使用SetWindowsHookEx
函数来设置键盘钩子,并选择WH_KEYBOARD
或WH_KEYBOARD_LL
参数。然后,在匹配的KeyboardProc或LowLevelKeyboardProc函数中处理按键事件,并过滤掉任何F6键。请确保对于非F6键按下事件,调用CallNextHookEx
函数,因为如果未调用CallNextHookEx
函数,则会“吃掉”键盘消息。
您需要将这些代码放到一个DLL文件中;您需要32位和64位两个版本的DLL文件,因为32位应用程序只能注入32位DLL文件,64位应用程序只能注入64位DLL文件。
您也可以尝试基于RegisterHotKey
函数的方法。这比钩子更安全,但如果另一个应用程序在您之前调用RegisterHotKey
并指定F6,则您将无法注册热键。
由于您不希望在热键上添加任何额外的修饰符,因此调用将类似于:
RegisterHotKey(myHwnd, 1, 0, VK_F6);
其中myHwnd
是您窗口的HWND(或者如果您更愿意在消息循环中处理WM_HOTKEY
消息,则可以选择nullptr
),1
是热键的标识符,可以是任何int类型的值,0
指定没有修饰键(如Ctrl、Alt、Windows键等),而VK_F6
是F6键的虚拟键码。
KeyboardProc
,因为描述说明该事件将作为消息传递到你的消息循环中。 - MSaltersSetWindowsHookEx
文档中的这一部分吗?请注意,WH_MOUSE、WH_KEYBOARD、WH_JOURNAL、WH_SHELL和低级别钩子可以在安装钩子的线程上调用,而不是处理钩子的线程。我不完全理解这一点;您是说钩子回调将被视为普通的Windows消息,并留在您的正常消息循环中,而不是通常的钩子行为调用指定的回调函数吗?那么回调函数是否仍然必要呢? - cf-RegisterHotKey
)。 - cf-DefWindowProc
在您的钩子函数的调用堆栈上,那么这也不会让我感到惊讶。 - MSaltersRegisterHotKey
,在退出前是否应该调用 UnregisterHotKey
? - LovelyHanibalRegisterHotKey(VK_F6 ...)
,它会触发发送WM_HOTKEY
消息。因此你需要一个Windows消息循环。