Чтение нажатия клавиш и состояния клавиатуры

keyboard

Делфи реализует в объектах элементов интерфейса различные события — в том числе нажатия клавиш. Но мы получаем уже конкретные ASCII коды, при этом приложение должно удерживать фокус ввода. Как же работать с состоянием клавиатуры без событий onkey и получить информацию о статусах клавиш даже ни имея фокуса ввода?

Для чего это может понадобиться? Приложения читающие клавиатуру, не имея фокуса ввода, вообще то довольно подозрительны. Они вызывают соответствующую реакцию у эвристических алгоритмов антивирусных программ.

Читать клавиатуру без фокуса ввода нужно, наример, такому приложению как известный многим punto switcher.

А я когда давно писал программу UO shra’s pilot, для программирования и запуска макросов в Ultima Online. Там мне приходилось закреплять окошко пульта управления «пилотом» поверх всех окон, т.к. для запуска скрипта нужно было нажать соответствующую кнопку на панели. Сейчас бы я сделал иначе, например, закрепил вызов скриптов за функциональными клавишами или их комбинациями.

Рассмотрим основные функции, которые нам предоставляют библиотеки ОС.

Вот интересные функции, входящие в состав USER32.dll. В Delphi они объявляются в юните windows.

Две функции читают состояние определенной клавиши, а третья — считывает состояние сразу всей клавиатуры в указанный буфер памяти (256 байт).

function GetKeyState(virtKey: Integer);
function GetAsyncKeyState(key: Integer);
function GetKeyboardState(var: KeyState: Byte);

Так как функции возвращают «какие то» состояния, возникает вопрос как с ними работать.

Как проверить нажата или нет виртуальная кнопка?

Вот так можно проверить нажата или нет клавиша «левый шифт»:

Чем отличается GetKeyState() от GetAsyncKeyState()?

Суть их работы примерно одинакова. Но есть кое какие отличия. Битовая маска состояния клавиш на выходе этих функций отличается. Подробности описывать не стану, т.к. выше есть ссылка на помощь microsoft. Покажу лучше пару примеров, чтобы вам меньше забивать себе голову всякой всячиной :).

Одна функция проверяет зажат ли шифт (любой из двух), а вторая проверяет статус CAPSLOCK.

Что может нам ещё понадобиться при чтении данных с клавиатуры? Возможно, стоит проверить текущую раскладку активного приложения.

Написать комментарий

Мало букафф? Читайте есчо !

Пишем DLL на Delphi

Декабрь 13, 2015 г.

Это не гайд по созданию библиотек функций на Delphi. Я предлагаю готовый каркас, с которого удобно начать написание. Если вы не пишите каждый день новую ...

Читать

Как в Delphi записать в файл

Октябрь 16, 2015 г.

Это можно сказать хрестоматийная задача. Как мы это делали ещё в школе на Турбо Паскале (Turbo Pascal), так это до сих пор работает в Delphi. Конечно же похожие примеры можно найти в сети, но Интернет - большой, а хороших примеров мало. Потому я время ...

Читать

 

Комментарии к «Чтение нажатия клавиш и состояния клавиатуры»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: