Как обрабатывать события клавиатуры в стандартном диалоге winapi? - PullRequest
3 голосов
/ 29 августа 2011

Я не часто работаю с Winapi, я пишу почти. NET код.Но в настоящее время я должен использовать winapi, чтобы сделать простой диалог.Там я хочу справиться с некоторыми ключевыми событиями.Поэтому я наблюдал за соответствующим сообщением обратного вызова WM_KEYDOWN или WM_KEYUP на MSDN и добавил его в свою функцию обратного вызова.

INT_PTR CALLBACK cbfunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  switch(message) {
    // ...

    case WM_KEYUP:
        MMsgBox("up"); // I never get here
        return 0;

    case WM_KEYDOWN:
        MMsgBox("down"); // I never get here        
        return 0;

    // ...
  }
  return 0;
}

Но ни WM_KEYUP, ни WM_KEYDOWN никогдаполучить срабатывание.Тогда я заявил, что ищу решение этой проблемы.Я думал, что мой диалог съест это сообщение.Поэтому я добавил:

    case WM_GETDLGCODE: 
        return DLGC_WANTALLKEYS;

В результате это не помогает.Другие решения, которые я нашел, были следующие:

  • В качестве альтернативы можно использовать событие WM_GETDLGCODE для обработки этих ключей, как предложено для здесь .
  • .нашел много потоков (например, this ), говорящих о методе с именем PreTranslateMessage.Но у меня даже нет этого класса, потому что я просто создаю свой диалог, используя DialogBoxParam

Так что ни один из них не работал для меня.Сейчас я понятия не имею, как с этим справиться.Что-то, что я заметил, это то, что при нажатии клавиш появляется сообщение WM_COMMAND.

С уважением Nem.

Ответы [ 3 ]

5 голосов
/ 29 августа 2011

Согласно этой ссылке , некоторые сообщения трудно перехватить с помощью диалоговых окон, поскольку Windows обрабатывает их внутренне и никогда не достигает DialogProc. Вот два варианта, которые я могу придумать:

  1. Использование GetAsyncKeyState для события WM_COMMAND
  2. Создайте пользовательское диалоговое окно, DialogProc для которого будет обрабатывать WM_KEYDOWN и т. Д. Сообщения.
0 голосов
/ 10 апреля 2017

DialogProc не получает события WM_KEY (и многие другие тоже).Вы можете:

  1. Подклассить диалоговое окно (переписать его WndProc) и обработать все сообщения там, sample
  2. Зарегистрировать горячую клавишу для HWND диалогового окна, а затемполучить WM_HOTKEY в DlgProc (но зарегистрированные комбинации клавиш будут общесистемными)
  3. Создать свой собственный цикл сообщений, ссылка
0 голосов
/ 18 сентября 2011

Заменить

case WM_KEYUP: MMsgBox ("вверх");// Я никогда не получаю здесь return 0;

case WM_KEYDOWN:
    MMsgBox("down"); // I never get here        
    return 0;

С этим

case WM_KEYUP: MMsgBox ("up");// я никогда не получаю здесь break;

case WM_KEYDOWN:
    MMsgBox("down"); // I never get here        
    break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...