Поделиться через


Функция RegisterHotKey (winuser.h)

Определяет горячий ключ на уровне системы.

Синтаксис

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

Параметры

[in, optional] hWnd

Тип: HWND

Дескриптор окна, который получит WM_HOTKEY сообщения, созданные горячим ключом. Если этот параметр null, WM_HOTKEY сообщения отправляются в очередь сообщений вызывающего потока и должны обрабатываться в цикле сообщений.

[in] id

Тип: int

Идентификатор горячего ключа. Если параметр hWnd имеет значение NULL, горячий ключ связан с текущим потоком, а не с определенным окном. Если горячий ключ уже существует с теми же hWnd и идентификатором параметров, см. примечания для выполненных действий.

[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 также завершается ошибкой, если нажатия клавиш, указанные для горячего ключа, уже зарегистрированы для другого горячего ключа. Однако некоторые предварительно существующие горячие ключи по умолчанию, зарегистрированные ОС (например, PrintScreen, которая запускает средство Snipping), могут быть переопределены другой регистрацией горячих ключей, когда одна из окон приложения находится на переднем плане.

Замечания

При нажатии клавиши система ищет совпадение со всеми горячими ключами. При поиске совпадения система отправляет сообщение WM_HOTKEY в очередь сообщений окна, с которым связан горячий ключ. Если горячий ключ не связан с окном, WM_HOTKEY сообщение публикуется в потоке, связанном с горячим ключом.

Если горячий ключ уже существует с тем же hWnd и параметров идентификатора, он сохраняется вместе с новым горячим ключом. Приложение должно явно вызывать unregisterHotKey, чтобы отменить регистрацию старого горячего ключа.

Ключ F12 зарезервирован для использования отладчиком в любое время, поэтому его не следует регистрировать как горячий ключ. Даже если вы не отладите приложение, F12 зарезервирован в случае, если отладчик в режиме ядра или JIT-отладчик является резидентным.

Приложение должно указать значение идентификатора в диапазоне 0x0000 через 0xBFFF. Общая библиотека DLL должна указывать значение в диапазоне 0xC000 через 0xFFFF (диапазон, возвращаемый функцией GlobalAddAtom). Чтобы избежать конфликтов с идентификаторами горячего ключа, определенными другими общими библиотеками DLL, библиотека DLL должна использовать функцию GlobalAddAtom для получения идентификатора горячего ключа.

**Windows Server 2003: **Если горячий ключ уже существует с тем же hWnd и идентификатором параметров, он заменяется новым горячим ключом.

Примеры

В следующем примере показано, как использовать функцию RegisterHotKey с флагом MOD_NOREPEAT.

В этом примере для основного потока регистрируется горячий ключ ALT+b. При нажатии горячего ключа поток получит сообщение WM_HOTKEY, которое будет выбрано в вызове GetMessage. Так как в этом примере используется MOD_ALT со значением MOD_NOREPEAT для fsModifiers, поток будет получать только другое сообщение WM_HOTKEY при освобождении клавиши B, а затем снова нажимается, пока клавишу 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