#c #windows #winapi
#c #Windows #winapi
Вопрос:
Правильно ли я понимаю, что единственный способ обнаружить ALTнажатие клавиши в приложении C Windows — это нажатие клавиатуры?
Может быть несколько дочерних окон, и настройка WM_KEYDOWN
для каждого из них невозможна.
Ускоритель "VK_MENU, some_id, VIRTKEY"
, похоже, не работает.
Нет главного меню для кражи ALT
функциональности. Обычный Win32, без MFC.
Комментарии:
1. Если вы являетесь владельцем приложения, вам не нужны крючки
2. Для меня это звучит как проблема XY . Какую проблему вы в конечном счете пытаетесь решить?
3. У меня есть скелет приложения, но в нем могут быть встроенные элементы управления ActiveX. @IInspectable: я пытаюсь зафиксировать нажатие клавиши Alt, чтобы сгенерировать сообщение в главном окне. Например, для создания главного меню.
4. @RemyLebeau: WM_KEY * отправляется в окно, которое имеет фокус. Если основное внимание уделяется встроенному ActiveX, в главном окне его нет.
5. Вы пробовали использовать IOleControlSite ::TranslateAccelerator для прослушивания сообщений с клавиатуры, доставляемых элементам управления ActiveX? Для хоста и элемента управления ActiveX уже существует механизм согласования сообщений и меню с клавиатуры. В конце концов, Excel и Internet Explorer справляются с этим.
Ответ №1:
Найдено решение:
// Main message loop:
while (GetMessage(amp;msg, nullptr, 0, 0)) {
if (msg.message == WM_SYSKEYDOWN amp;amp; msg.wParam == VK_MENU) {
// single ALT key pressed, do something
}
if (!TranslateAccelerator(msg.hwnd, hAccelTable, amp;msg)) {
TranslateMessage(amp;msg);
DispatchMessage(amp;msg);
}
}
Комментарии:
1. Это работает только в том случае, если окно действительно получает сообщение. Не гарантируется, если окно не находится на переднем плане.
2. @selbie: да, это именно то, что мне было нужно. То же, что и ускоритель. Я бы предпочел добавить его в таблицу ускорителей, но, похоже, он не поддерживает сообщения «SYSKEY *».
3. Это потребует, чтобы система всегда выполняла ваш цикл сообщений. Как оказалось, это не так. Система запустит свой собственный цикл вложенных сообщений, минуя ваш. Это может произойти по ряду причин, например, при перемещении / изменении размера окна, при открытии меню или при отображении модального диалога.
4. @IInspectable: цель состоит в том, чтобы заставить его действовать как ускоритель, чтобы это было нормально с диалогами или когда любой другой процесс в данный момент активен. Но вы правы в отношении изменения размера окна: в одном конкретном странном сценарии процесс теряет активацию, и мне приходится дважды нажимать на кнопку, если я не нажму в любом месте окна. Теоретически это все еще нормально (ускорители действуют точно так же). Это легко компенсировать.