Учебное пособие: Подклассы окон
параметры могут быть следующими:
key определяет назначаемую клавишу
id посылаемый код извещения
type тип клавиши ASCII, VIRTKEY или опущен
options указывает состояние специальных клавиш и некоторые действия: NOINVERT, ALT, SHIFT, CONTROL или опущен.
подробнее рассмотрим назначение акселераторов на примере:
“A”, 100 // послать извещение 100 при нажатии А
65, 100, ASCII // то же самое, ASCII код 65 соответствует А
“^A”, 101 // послать 101 при нажатии Ctrl-A
“A”, 101, CONTROL // то же самое
VK_SPACE, 102, VIRTKEY // послать 102 при нажатии Space
VK_SPACE, 103, VIRTKEY, SHIFT // послать 103 принажатии Shift-Space
Несколько слов следует сказать о применении акселераторов в приложении. Сам факт загрузки акселератора в память еще не обозначает его применения. Для того, что бы сообщения от клавиатуры начали обрабатываться акселератором надо в главном цикле обработки сообщений включить специальлные средства для их трансляции.
int TranslateAccelerator( hWnd, hAccel, lpMSG );
Параметр hWnd указывает окно, которое будет получать извещения, hAccel задает хендл таблицы акселераторов, lpMSG - адрес структуры MSG, содержащей сообщение.
При обычном применении акселератора извлеченное из очереди сообщение передается в эту функцию. Если это сообщение клавиатуры и данное нажатие на клавишу транслируется акселератором, то указанное окно получает сообщение WM_COMMAND и процедура возвращает TRUE; во всех остальных случаях возвращается FALSE, говоря о том, что сообщение не было трансировано в другое. Считается, что если сообщение было обработано акселератором, то дальнейшая его обработка не требуется - то есть обычный процесс трансляции и диспетчеризации этого сообщения исключается. При этом главный цикл обработки сообщений приобретает следующий вид:
MSG msg;
HACCEL hAccel;
HWND hWnd;
...
hAccel= LoadAccelerators( hInstance, “AccName” );
...
while ( GetMessage( &msg, NULL, NULL, NULL ) ) {
if ( !hAccel || !TranslateAccelerator( hWnd, hAccel, &msg ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
...