Programming: Delphi
Delphi HotKeys - горячии клавишы
Источник:
HotKeys - комбинации клавиш, на которые может реагировать
приложение, даже если оно не имеет фокуса или запущено в трее.
Hotkey состоит из клавиши-модификатора (Win, Alt, Control,
Shift), и нажатия на любую другую клавишу, которая имеет виртуальный
код.
Для того чтобы научить программу обрабатывать горячие клавиши,
углубимся в загадочные джунгли API,
но прежде этого создадим обработчик события WM_HOTKEY. Для этого
объявим в классе TForm1 следующий метод: private procedure WM_HotKeyHandler (var Message: TMessage);
message WM_HOTKEY;
И определим его вот таким образом: procedure TForm1.WM_HotKeyHandler (var Message: TMessage);
var
idHotKey: integer; //идентификатор, но об этом - позже
fuModifiers: word; //модификатор MOD_XX
uVirtKey: word; //код виртуальной клавиши VK_XX
begin
// параметры сообщения получаем так:
idHotkey:= Message.wParam;
fuModifiers:= LOWORD(Message.lParam);
uVirtKey:= HIWORD(Message.lParam);
//теперь - небольшая проверочка:
if (fuModifiers = MOD_ALT) AND (uVirtKey = VK_F10) then
caption:='Alt-F10 нажата';
inherited;
end;
В этом примере обработчик сообщения WM_HOTKEY проверяет, являются
ли полученные параметры сигналом о нажатии комбинации Alt-F10, и в
случае положительного ответа в заголовок окна главной формы
выводится соответствующая строка.
Теперь обратимся непосредственно к созданию горячей клавиши - в
нашем примере это будет все та же Alt-F10. Вначале ее нужно
зарегистрировать в системе. Как это делается? При помощи функции:
BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);
- hWnd - окно, обрабатывающее сообщение WM_HOTKEY,
- fsModifiers - модификаторы (MOD_ALT, MOD_CONTROL, MOD_SHIFT,
MOD_WIN),
- vk - виртуальный код клавиши (см. константы с префиксом VK_).
Параметр id заслуживает отдельного разговора.
Для приложения значение id может лежать в диапазоне 0000h..BFFFh,
а для разделяемых динамических библиотек диапазон будет таким:
C000h..FFFFh.
Однако во избежание конфликтов между горячими клавишами различных
процессов целесообразно использовать значение, возвращаемое функцией
GlobalAddAtom, передавая ей в качестве параметра некую
null-terminated строку длиной до 255 символов.
Вот как это делается:
Объявим глобальную переменную keyid: integer;
Она станет атомом, который создастся вышеописанной функцией, и
будет служить идентификатором горячей клавиши. Для удобства поместим
на форму две кнопки - первая будет создавать HotKey, вторая -
уничтожать.
Итак, создаем и регистрируем горячую клавишу: procedure TForm1.Button1Click(Sender: TObject);
begin
keyid:=GlobalAddAtom('My Hotkey'); //создаем атом
RegisterHotKey(handle,// сообщение о HotKey будет получать форма
keyid, // регистрируем атом как id
MOD_ALT,// модификатор у нас - клавиша Alt
VK_F10 // вирт. клавиша - F10
);
end;
А следующий код отменяет зарегистрированную клавишу, и удаляет
атом: procedure TForm1.Button3Click(Sender: TObject);
begin
UnregisterHotKey(handle, keyid);
GlobalDeleteAtom(keyid);
end;
Рассмотрим еще один важный аспект работы с клавиатурой - способ
отслеживания состояние клавиш Num Lock, Caps Lock, Scroll Lock и
Insert.
Понятное дело, что стандартными средствами Delphi тут не
обойтись.
Будем снова раскапывать API. Во-первых, зададим переменную Key
типа word.
Этой переменной можем присвоить значение одной из констант: VK_NUMLOCK
VK_CAPITAL
VK_SCROLL
VK_INSERT
Теперь: Var state: TKeyboardState;
begin
GetKeyboardState(state); //получить состояние клавиши
if Odd(state[VK_NUMLOCK]) then ; //клавиша "включена"
//как управлять состоянием клавиши?
state[key] := state[key] XOR 1; //циклично переключить
state[key] := state[key] OR 1; //включить
state[key] := state[key] AND (NOT 1); //выключить
SetKeyboardState(state); //установим новое значение
end;
Программное переключение раскладки клавиатуры - если Microsoft
Word это умеет, то почему не попробовать и нам?
ActivateKeyboardLayout(0,HKL_NEXT) - циклично переключает
раскладку.
Загрузить русскую можно с помощью кода: LoadKeyboardLayout('00000419', KLF_ACTIVATE),
а английскую LoadKeyboardLayout('00000409',KLF_ACTIVATE).
Вот, пожалуй, и все премудрости работы с клавиатурой.
При перепечатке любого материала
с сайта, видимая ссылка на источник www.warayg.narod.ru
и все имена, ссылки авторов обязательны.
© 2005
|