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

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.

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

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

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

Как добавить одинарную кавычку в строку в Delphi

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

Давно ничего не кропал на Delphi. Забыл уже элементарный синтаксис. Начинаю кое что восстанавливать, и по пути возникают вопросы вроде subj. Целых два способа. Ставим кавычку с помощью преобразования кода символа. [crayon-5bab4c3be5714608404901/] ...

Читать

Исходники комивояжера

Сентябрь 8, 2009 г.

Каждый год, обычно весной, просят у меня исходники по задаче комивояжера. А я их давно сам не видел, что называется, и вроде как отмораживаюсь, говорю - куда дел, не знаю. Но тут разгребал проекты по работе и наткнулся на избранные архивы дельфийских ...

Читать

 

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

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



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