Страница 1 из 1
Как сделать горячие клавиши для всего окна приложения?
Добавлено: 17 янв 2009, 01:04
[:: SynTronic ::]
Как обрабатывать нажания клавиш с клавиатуры процедурой главного окна, вне зависимости от того, на каком дочернем элементе стоит фокус? Допустим чтобы по нажанию F1 справка выдавалась?
Сначала думал что RegisterHotKey, да она во всей системе регистрирует клавиши...
Re: Как сделать горячие клавиши для всего окна приложения?
Добавлено: 17 янв 2009, 08:42
Romeo
Для обработки Help обрабатывай OnHelp, ShowHelp. Для обработки иных горячих клавиш перегружай PreTranslateMessage, который для этого и предназначен. Претранслейт пробрасывается через все окна от чайла к паренту, так что его можно перехватывать там, где тебе удобно. Часто в его теле просто вызывают TranslateAccelerator для уже готовой таблицы шоткатов.
Re: Как сделать горячие клавиши для всего окна приложения?
Добавлено: 18 янв 2009, 15:02
[:: SynTronic ::]
Спасибо за ответ, Romeo! Очень помог
Re: Как сделать горячие клавиши для всего окна приложения?
Добавлено: 19 янв 2009, 21:49
WinMain
Я когда-то делал перехватчик нажатия кнопок клавиатуры. Причём его можно с одинаковым успехом применять не только в приложениях на 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;
}
Re: Как сделать горячие клавиши для всего окна приложения?
Добавлено: 22 янв 2009, 15:21
BBB
WinMain,
интересно, а нажатие клавиши <Alt> под Windows в принципе возможно перехватить?
Когда-то давно, под DOS-ом, у меня раскладка клавиатуры переключалась нажатием <Alt>-а (это keyrus был, если точно - то правым <Alt>-ом). Так что потом, под Windows, у меня была
голубая мечта, чтобы клавиатура переключалась так же <Alt>-ом

Re: Как сделать горячие клавиши для всего окна приложения?
Добавлено: 23 янв 2009, 00:09
WinMain
Мой перехватчик ловит нажатие любых клавиш, в т.ч. и Alt-, и Shift-, и Ctrl-...
Вот и сам пример данного приложения. Можно стать отладчиком в метод CKeyHookDlg::OnPressKey(...) и посмотреть значение переменной wParam после каждого нажатия клавиши.