RegisterHotKey 函数 (winuser.h)

定义系统范围的热键。

语法

BOOL RegisterHotKey(
  [in, optional] HWND hWnd,
  [in]           int  id,
  [in]           UINT fsModifiers,
  [in]           UINT vk
);

参数

[in, optional] hWnd

类型:HWND

将接收热键生成的 WM_HOTKEY 消息的窗口句柄。 如果此参数 NULLWM_HOTKEY 消息将发布到调用线程的消息队列,并且必须在消息循环中进行处理。

[in] id

类型:int

热键的标识符。 如果 hWnd 参数为 NULL,则热键与当前线程(而不是特定窗口)相关联。 如果热键已存在具有相同的 hWndid 参数,请参阅“备注”以获取所执行的操作。

[in] fsModifiers

类型:UINT

必须与 vk 参数指定的键结合使用才能生成 WM_HOTKEY 消息, fsModifiers 参数可以是以下值的组合。

含义
MOD_ALT
0x0001
必须按住任一 ALT 键。
MOD_CONTROL
0x0002
必须按住 Ctrl 键。
MOD_NOREPEAT
0x4000
更改热键行为,使键盘自动重复不会生成多个热键通知。
Windows Vista:不支持 此标志。
MOD_SHIFT
0x0004
必须按住 Shift 键。
MOD_WIN
0x0008
必须按住任一 WINDOWS 密钥。 这些键标有 Windows 徽标。 涉及 WINDOWS 键的键盘快捷方式保留供操作系统使用。

[in] vk

类型:UINT

热键的虚拟键代码。 请参阅 虚拟密钥代码

返回值

类型:BOOL

如果函数成功,则返回值为非零。

如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError

如果尝试将热键与另一个线程创建的窗口相关联,则此函数将失败。

通常,如果为热键指定的击键已注册另一个热键,RegisterHotKey 也会失败。 但是,当某个应用的窗口位于前台时,OS 注册的某些预先存在的默认热键(如启动 Snipping 工具的 PrintScreen)可能会被另一个热键注册覆盖。

言论

按下某个键时,系统会查找针对所有热键的匹配项。 找到匹配项后,系统会将 WM_HOTKEY 消息发布到与热键关联的窗口的消息队列。 如果热键未与窗口关联,则会将 WM_HOTKEY 消息发布到与热键关联的线程。

如果热键已存在同一 hWnd,并且 id 参数,则会与新的热键一起维护。 应用程序必须显式调用 UnregisterHotKey 才能注销旧的热键。

F12 密钥保留供调试器随时使用,因此不应将其注册为热键。 即使未调试应用程序,如果内核模式调试器或实时调试器驻留,则保留 F12。

应用程序必须在0x0000到0xBFFF的范围内指定 ID 值。 共享 DLL 必须通过 0xFFFF(GlobalAddAtom 函数返回的范围)指定0xC000区域中的值。 为了避免与其他共享 DLL 定义的热键标识符冲突,DLL 应使用 GlobalAddAtom 函数来获取热键标识符。

**Windows Server 2003:**如果热键已存在具有相同的 hWndid 参数,则它将被新的热键替换。

例子

以下示例演示如何将 RegisterHotKey 函数与 MOD_NOREPEAT 标志一起使用。

在此示例中,为主线程注册了热键“ALT+b”。 按下热键后,线程将收到一条 WM_HOTKEY 消息,该消息将在 getMessage 调用 中拾取。 由于本示例使用 MOD_ALTfsModifiersMOD_NOREPEAT 值,因此,当释放“b”键时,线程将仅接收另一条 WM_HOTKEY 消息,然后在按下“ALT”键时再次按下。

#include "stdafx.h"

int _cdecl _tmain (
    int argc, 
    TCHAR *argv[])
{           
    if (RegisterHotKey(
        NULL,
        1,
        MOD_ALT | MOD_NOREPEAT,
        0x42))  //0x42 is 'b'
    {
        _tprintf(_T("Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag\n"));
    }
 
    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
            _tprintf(_T("WM_HOTKEY received\n"));            
        }
    } 
 
    return 0;
}

要求

要求 价值
最低支持的客户端 Windows Vista [仅限桌面应用]
支持的最低服务器 Windows Server 2003 [仅限桌面应用]
目标平台 窗户
标头 winuser.h (包括 Windows.h)
User32.lib
DLL User32.dll

另请参阅

GlobalAddAtom

键盘输入

注册当前应用的热键(CSRegisterHotkey)

注册当前应用的热键(CppRegisterHotkey)

UnregisterHotKey

WM_HOTKEY