Можно ли использовать WM_HOTKEY для имитации событий горячих клавиш? - PullRequest
0 голосов
/ 01 июня 2011

В моей программе (C ++, WinAPI) я хотел имитировать нажатие некоторых существующих горячих клавиш, установленных в других работающих программах.Я знаю, что есть функция SendInput , которая имитирует ввод с клавиатуры, но она выглядела слишком много работы, поскольку ей нужно создать много структур для клавиш.Я пытался использовать SendMessage или PostMessage с параметрами HWND_BROADCAST и WM_HOTKEY.Ни один из них не работал.

Код выглядит следующим образом:

WORD hotkey = MAKEWORD(MOD_CONTROL, VK_SPACE); // Ctrl + Space

SendMessage( HWND_BROADCAST,
             WM_HOTKEY,
             (WPARAM)hotkey , 0);

Я на правильном пути?или это должно быть сделано совершенно по-другому?

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Делать не использовать HWND_BROADCAST с чем-то вроде WM_HOTKEY. На самом деле, избегайте HWND_BROADCAST, за исключением тех случаев, когда вы действительно хотите передавать сообщение каждому отдельному окну. В противном случае вы столкнетесь с невероятным количеством проблем с другими окнами, обрабатывающими ваше сообщение.

Вы также неправильно используете WM_HOTKEY. wParam не состоит из HIWORD / LOWORD двух ключей. Программисты назначают горячие клавиши с RegisterHotKey , которым они передают идентификатор, а также горячие клавиши, которые генерируют сообщение WM_HOTKEY с этим идентификатором.

Есть несколько способов найти этот идентификатор, который должен быть вашим wParam. Во-первых, вы можете отлаживать цель и точку останова в RegisterHotKey (), пока не найдете нужный. В качестве альтернативы вы можете использовать Spy ++ и нацелить окно и проверить, что это за идентификатор.

Конечно, есть вероятность, что горячая клавиша не работает через горячую клавишу, а вместо этого - что-то вроде ускорителя клавиатуры. Вам нужно будет выполнить аналогичные шаги, чтобы найти параметры для WM_COMMAND или WM_SYSCOMMAND, которые получаются целью при нажатии этой кнопки. Я рекомендую использовать Spy ++.

1 голос
/ 01 июня 2011

SendInput - лучший ответ, если честно.Это связано с тем, что в цикле сообщений ваши вызовы traslateaccellerator будут смотреть на сообщение, и в этом сообщении на LPARAM будет установлен битовый флаг, указывающий, какие другие клавиши нажимаются этой клавишей.Вы не хотите заполнять этот битовый флаг самостоятельно, но ..... на всякий случай ... и не хотите использовать SendInput ... http://msdn.microsoft.com/en-us/library/ms646280%28VS.85%29.aspx подробно, как это сделать.Конечно, если вы хотите использовать AcceleratorTable, это легко сделать с помощью редактора ресурсов, просто в цикле сообщений, подключите его с помощью этого http://msdn.microsoft.com/en-us/library/ms646373%28VS.85%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...