Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
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);
Параметр 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). Вот, пожалуй, и все премудрости работы с клавиатурой. |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Рейтинги
|