управление редактированием win32 api и ускоритель клавиатуры
Я пишу простой редактор Блокнота (настроенный в соответствии с некоторыми дополнительными функциями) в win32 api. Элемент управления edit заполняет область приложения и постоянно фокусируется. Мне также нужно обрабатывать некоторые команды клавиатуры, такие как Ctl-S. Поэтому я использую таблицу ускорителя клавиатуры обычным способом для определения ключа Ctl-S, и в моем цикле сообщений у меня есть TranslateAccelerator
while (GetMessage(&Msg,NULL,0,0)>0)
{
if (!TranslateAccelerator(Msg.hwnd,HAccel,&Msg))
{ TranslateMessage(&Msg); DispatchMessage(&Msg); }
}
теперь моя проблема в том, что, поскольку окно редактирования всегда имеет фокус, когда пользователь вводит Ctl-S, Я не получите сообщение WM_COMMAND вообще. (Я понимаю, что HIWORD wParam станет 1 для ускорителя клавиатуры, но это не проблема здесь).
case WM_COMMAND:
switch (LOWORD(wParam))
{
...
case ID_CTL_S_PRESSED: {My code here} break;
...
}
Если я попробую код без управления редактированием, я получу сообщение WM_COMMAND выше. Итак, как мне получить сообщение WM_COMMAND для ускорителя клавиатуры, когда элемент управления редактированием всегда имеет фокус?
1 ответов
первый параметр TranslateAccelerator
описан как:
дескриптор окна, сообщения которого должны быть переведены.
это вводит в заблуждение и не совсем правильно. Раздел о обработка сообщений WM_COMMAND (с помощью ускорителей клавиатуры) ближе к делу:
при использовании ускорителя окно, указанное в функции TranslateAccelerator, получает WM_COMMAND или Сообщение WM_SYSCOMMAND.
чтобы устранить проблему, замените вызов TranslateAccelerator
следующим образом:
if (!TranslateAccelerator(hwndMain,HAccel,&Msg))
замена Msg.hwnd
С помощью дескриптора окна в Главное окно будет направлять WM_COMMAND
сообщение, где вы хотите его.