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; beginGetKeyboardState(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) - циклічно перемикає розкладку.
Завантажити українську можна за допомогою коду:
Ось, мабуть, і всі мудрості роботи з клавіатурою.