logo search
ОСиС-2014(Передача№1) / 1_ОперСистСети_ЛР_Методичка_2012 / ОС_ЛР-09-13-14 / LAB7 / LAB7

Использование таблицы акселераторов

Для использования описанных в файле ресурсов комбинаций клавиш их необходимо загрузить, а также несколько модифицировать цикл выборки сообщений.

Загрузка таблицы акселераторов и получение ее хэндла осуществляется с помощью функции LoadAccelerators:

hAccel := LoadAccelerators(hInstance, 'MyAccel');

Цикл обработки сообщений дополняется вызовом функции проверки комбинаций клавиш по таблице:

while getMessage(msg, 0,0,0) do

if not TranslateAccelerator(hwnd, hAccel, msg) then begin

TranslateMessage(msg);

DispatchMessage(msg);

end;

Функция TranslateAccelerator проверяет, является ли сообщение msg сообщением клавиатуры и, если это так, проводит поиск комбинации нажатых клавиш в таблице акселераторов. Если комбинация найдена, вызывается оконная процедура окна hwnd и ей передается сообщение WM_COMMAND с кодом, идентифицирующим нажатую комбинацию, функция при этом возвращает TRUE. Для сообщений, не приводящих к посылке сообщения WM_COMMAND при трансляции, функция возвращает FALSE.

Параметр hwnd функции TranslateAccelerator позволяет сосредоточить обработку акселераторов в одной оконной процедуре: какое бы окно не являлось получателем сообщения msg (хэндл окна получателя содержится в теле сообщения), сообщение WM_COMMAND будет передано в оконную процедуру принудительно указанного окна hwnd. В качестве hwnd программа обычно должна передавать либо хэндл главного окна, либо хэндл ее активного окна.

Сообщение WM_COMMAND, порождаемое при нажатии быстрой клавиши, имеет следующие параметры:

loword(wParam) - числовой идентификатор комбинации клавиш из таблицы акселераторов

hiword(wparam) = 1; lParam = 0;

Если акселератор соответствует тому или иному пункту меню (имеет тот же идентификатор), то помимо сообщения WM_COMMAND той же оконной процедуре посылаются сообщения активизации меню, т.е. WM_INITMENU, WM_INITMENUPOPUP, WM_MENUSELECT. Если клавиша соответствует запрещенному пункту меню, то сообщения WM_COMMAND и прочие не посылаются.