Програмування на delphi - обмін досвідом

Дізнатися поточний стан будь-якої клавіші дуже просто за допомогою API - виклик функції GetKeyState. Формат виклику:
function GetKeyState (nVirtKey: Integer): SHORT;
nVirtKey - віртуальний код цікавить нас клавіші.
Повернення - якщо встановлений старший біт, то клавіша натиснута. Молодший біт встановлюється при відпуску клавіші. Для тригерних клавіш младній біт вказує, чи включена дана триггерная клавіша (тобто горить її лампочка)

Приклад Особливістю GetKeyState є те, що стан клавіші, повертається цією функцією, змінюється при читанні потоком клавіатурних повідомлень з його черги повідомлень. Функція GetAsyncKeyState не залежить від потоку повідомлень, що в ряді випадків досить зручно.

Швидкий доступ - реєстрація та обробка

Швидкий доступ - поєднання клавіш, які реєструються в системі і при їх натисканні система посилає повідомлення WM_HOTKEY того вікна, Handle якого було заявлено при реєстрації гарячої клавіші. При цьому не важливо, чи має вікно- одержувач фокус введення і мабуть воно на екрані. Це особливо зручно при написанні програм, які активізуються при натисканні певних сполучень клавіш (в неактивному стані такі додатки, як прищепило, не містять видимих ​​вікон).
Реєстрація проводиться за допомогою виклику API RegisterHotKey
function RegisterHotKey (hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL;
hWnd - Handle вікна, яке буде отримувати повідомлення при натисканні гарячої клавіші
id - ідентифікатор (просто число, яке передається в повідомленні WM_HOTKEY. id дозволяє додатку працювати з декількома гарячими клавішами, розрізняючи їх по id). Не можна визначити дві гарячі клавіші з однаковим id
fsModifiers - модифікатори. Визначають, які клавіші повинні бути натиснуті спільно з вказаною vk. Допустимі значення: MOD_ALT - ALT, MOD_CONTROL - CTRL, MOD_SHIFT - SHIFT
vk - віртуальний код клавіші
Якщо гарячу клавішу вдається зареєструвати, то функція повертає TRUE.

При завершенні програми необхідно скасувати реєстрацію гарячої клавіші за допомогою виклику UnregisterHotKey. При визве їй передається Handle вікна і id гарячої клавіші.
приклад:

Перехоплення натискань клавіші всередині програми.

Перехоплення натискання клавіші в Windows (hook)

Існують програми, яким необхідно перехоплювати всі натиснення клавіш в Windows, навіть якщо в даний момент активна інша програма. Це може бути, наприклад, програма, що перемикає розкладку клавіатури, резидентний словник або програма, що виконує інші дії після натискання "гарячої" комбінації клавіш.
Перехоплення всіх подій в Windows (в тому числі і подій від клавіатури) виконується за допомогою виклику функції SetWindowsHook (). Ця функція реєструє в системі Windows пастку (hook) для певного типу подій / повідомлень. Пастка - це призначена для користувача процедура, яка буде обробляти вказану подію. Основне тут те, що ця процедура повинна завжди бути присутнім в пам'яті Windows. Тому пастку поміщають в DLL і завантажують цю DLL з програми. Поки хоч одна програма використовує DLL, та не може бути вивантажено з пам'яті. Наведемо приклад такої DLL і програми, її використовує. У прикладі пастка перехоплює натиснення клавіш на клавіатурі і записує їх в текстовий файл
Даний приклад найпростіший і не враховує того, що при завершенні роботи пастку необхідно знімати. При роботі він пікає при кожному натисканні клавіші і скидає в текстовий файл параметри виклику. Приклад робочий, я використовував його для визначення кодів клавіш при написанні драйвера для мультимедійної клавіатури Genius (рідний речі теж писаний на Delphi, але кривої до неподобства - то сам повисне, але комп'ютер повісить).

Як відловити натискання клавіш для всіх процесів в системі?

Схожі статті