управление редактированием 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 сообщение, где вы хотите его.