Как обрабатывать нажания клавиш с клавиатуры процедурой главного окна, вне зависимости от того, на каком дочернем элементе стоит фокус? Допустим чтобы по нажанию F1 справка выдавалась?
Сначала думал что RegisterHotKey, да она во всей системе регистрирует клавиши...
Как сделать горячие клавиши для всего окна приложения?
Модераторы: Duncon, Hawk, Romeo, Eugie
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Для обработки Help обрабатывай OnHelp, ShowHelp. Для обработки иных горячих клавиш перегружай PreTranslateMessage, который для этого и предназначен. Претранслейт пробрасывается через все окна от чайла к паренту, так что его можно перехватывать там, где тебе удобно. Часто в его теле просто вызывают TranslateAccelerator для уже готовой таблицы шоткатов.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 17
- Зарегистрирован: 25 дек 2008, 15:37
Спасибо за ответ, Romeo! Очень помог
Я когда-то делал перехватчик нажатия кнопок клавиатуры. Причём его можно с одинаковым успехом применять не только в приложениях на MFC, но и с классами ATL/WTL и библиотекой VCL для C++ Builder. Весь перехватчик реализован в одном заголовочном файле _KeyHook.h
Вот как его нужно использовать:
Вот как его нужно использовать:
Код: Выделить всё
// Включить в код заголовочный файл...
[b]#include "_KeyHook.h"[/b]
// CKeyHookDlg dialog
class CKeyHookDlg :
public CDialog,
[b]public CKeyboardHook::Handler[/b] // добавить в объявление класса
{
// Добавить реализацию виртуального метода...
[b]virtual BOOL OnPressKey(WPARAM wParam, LPARAM lParam);[/b]
// Добавить обработчик события WM_DESTROY...
[b]afx_msg void OnDestroy();[/b]
};
// Имплементация методов...
BOOL CKeyHookDlg::OnInitDialog()
{
// Добавить в OnInitDialog() запуск перехватчика...
[b]KeyboardHookStart(this);[/b]
return TRUE;
}
void CKeyHookDlg::OnDestroy()
{
CDialog::OnDestroy();
// Остановить перехватчик при закрытии окна...
[b]KeyboardHookStop();[/b]
}
BOOL CKeyHookDlg::OnPressKey(WPARAM wParam, LPARAM lParam)
{
// Здесь происходит обработка событий нажатия кнопок
// wParam соответствует коду нажатой клавиши...
wParam;
// Если нужно исключить данное событие из дальнейшей обработки приложением, необходимо вернуть [b]FALSE[/b]
return TRUE;
}
- Вложения
-
- _KeyHook.zip
- (730 байт) 38 скачиваний
WinMain,
интересно, а нажатие клавиши <Alt> под Windows в принципе возможно перехватить?
Когда-то давно, под DOS-ом, у меня раскладка клавиатуры переключалась нажатием <Alt>-а (это keyrus был, если точно - то правым <Alt>-ом). Так что потом, под Windows, у меня была голубая мечта, чтобы клавиатура переключалась так же <Alt>-ом
интересно, а нажатие клавиши <Alt> под Windows в принципе возможно перехватить?
Когда-то давно, под DOS-ом, у меня раскладка клавиатуры переключалась нажатием <Alt>-а (это keyrus был, если точно - то правым <Alt>-ом). Так что потом, под Windows, у меня была голубая мечта, чтобы клавиатура переключалась так же <Alt>-ом

Мой перехватчик ловит нажатие любых клавиш, в т.ч. и Alt-, и Shift-, и Ctrl-...
Вот и сам пример данного приложения. Можно стать отладчиком в метод CKeyHookDlg::OnPressKey(...) и посмотреть значение переменной wParam после каждого нажатия клавиши.
Вот и сам пример данного приложения. Можно стать отладчиком в метод CKeyHookDlg::OnPressKey(...) и посмотреть значение переменной wParam после каждого нажатия клавиши.
- Вложения
-
- KeyHook.zip
- (23.75 КБ) 47 скачиваний