Глобальная горячая клавиша с WIN32 API? - PullRequest
15 голосов
/ 30 ноября 2009

Я был в состоянии установить локальные горячие клавиши как это

 RegisterHotKey(hwndDlg, 100, MOD_ALT | MOD_CONTROL, 'S');

Как я могу установить горячую клавишу как глобальную? Я хочу, чтобы это было там, даже когда мое окно скрыто.

Ответы [ 4 ]

11 голосов
/ 30 ноября 2009

Я решил это сам, но спасибо за ваш ответ вот что было не так ...

ShowWindow(hwndDlg, SW_HIDE);
RegisterHotKey(hwndDlg, 100, MOD_ALT | MOD_CONTROL, 'S');

если сначала зарегистрировать горячую клавишу, а затем спрятать окно ... она по какой-то причине игнорирует горячую клавишу ... да ладно .. теперь работает:)

6 голосов
/ 05 февраля 2013

http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms646309(v=vs.85).aspx

hWnd [in, необязательно]

Тип: HWND

<...> Если этот параметр имеет значение NULL, сообщения WM_HOTKEY отправляются на очередь сообщений вызывающего потока и должна быть обработана в Цикл сообщений.

Это лучший способ регистрации глобальных горячих клавиш.

4 голосов
/ 30 ноября 2009

Неважно, является ли ваше окно видимым или нет. Вы не должны использовать то, что вы планируете уничтожить (например, диалог). Создайте отдельное (невидимое) окно, если у вас нет другого подходящего окна.

2 голосов
/ 08 июля 2017

Сначала вы определяете одну или несколько констант для ваших горячих клавиш

#define HOTKEY1 1000
#define HOTKEY2 1002

Затем вы регистрируете эти горячие клавиши

RegisterHotKey(NULL, HOTKEY1, MOD_ALT + MOD_SHIFT, 0x53); // ALT+SHIFT+s
RegisterHotKey(NULL, HOTKEY2, MOD_ALT + MOD_SHIFT, 0x51); // ALT+SHIFT+q

Наконец, в главном событии посмотрите эти горячие клавиши и ответьте на них:

         if (msg.message == HOTKEY1)
         {
             switch (LOWORD(msg.wParam))
             {
             case HOTKEY1:
                 // do such and such
                 break;
             case HOTKEY2:
                 // do such and such
                 break
             }
         }
...