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) - циклічно перемикає розкладку.

Завантажити українську можна за допомогою коду:

Ось, мабуть, і всі мудрості роботи з клавіатурою.