Массивы состояния клавиш клавиатуры — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Массивы состояния клавиш клавиатуры

2022-10-03 26
Массивы состояния клавиш клавиатуры 0.00 из 5.00 0 оценок
Заказать работу

Одной из задач при разработке модели аппаратного ввода Windows было обеспечение ее отказоустойчивости. Отказоустойчивость обеспечивается независимой обработкой ввода потоками, что предотвращает неблагоприятное воздействие одного потока на другой. Но этого недостаточно для надежной изоляции потоков друг от друга, поэтому система поддерживает дополнительную концепцию — локальное состояние ввода. Каждый поток обладает собственным состоянием ввода, сведения о котором хранятся в структуре THREADINFO. В информацию об этом состоянии включаются данные об очереди виртуального ввода потока, а также группа переменных. Последние содержат управляющую информацию о состоянии ввода. Относительно клавиатуры поддерживаются следующие сведения: какое окно находится в фокусе клавиатуры, какое окно активно в данный момент, какие клавиши нажаты, каково состояние курсора ввода.

Информация о том, какие клавиши нажаты, сохраняется в массиве синхронного состояния клавиш. Этот массив включается в переменные локального состояния ввода каждого потока. В то же время массив асинхронного состояния клавиш, в котором содержится аналогичная информация, — только один, и он разделяется всеми потоками. Массивы отражают состояние всех клавиш на данный момент, и функция GetAsyncKeyState позволяет определить, нажата ли сейчас заданная клавиша. GetAsyncKeyState всегда возвращает 0 (не нажата), если ее вызывает другой поток, а не тот, который создал окно, находящееся сейчас в фокусе ввода.

Функция GetKeyState отличается от GetAsyncKeyState тем, что возвращает состояние клавиатуры на тот момент, когда из очереди потока извлечено последнее сообщение от клавиатуры. Эту функцию можно вызвать в любой момент; для нее неважно, какое именно окно в фокусе.

Клавиатурные ловушки

В операционной системе MicrosoftWindows ловушкой, или хуком (hook) называется механизм перехвата событий с использованием особой функции (таких как передача сообщений Windows, ввод с мыши или клавиатуры) до того, как они дойдут до приложения. Эта функция может затем реагировать на события и, в некоторых случаях, изменять или отменять их.

Функции, получающие уведомления о событиях, называются фильтрующими функциями и различаются по типам перехватываемых ими событий. Для того чтобы Windows смогла вызывать функцию-фильтр, эта функция должна быть прикреплена к хуку (например, к клавиатурному хуку). Прикрепление одной или нескольких фильтрующих функций к какому-нибудь хуку называется установкой хука. Для установки и удаления фильтрующих функций приложения используют функции Win32 API SetWindowsHookEx и UnhookWindowsHookEx. Некоторые хуки можно устанавливать как для всей системы, так и для одного конкретного потока.

Если к одному хуку прикреплено несколько фильтрующих функций, Windows реализует очередь функций, причем функция, прикрепленная последней, оказывается в начале очереди, а самая первая функция — в ее конце. Очередь функций-фильтров (см. рисунок 8) поддерживается самой Windows, что позволяет упростить написание фильтрующих функций и улучшить производительность операционной системы.

Система поддерживает отдельные цепочки для каждого типа хуков. Цепочка хуков — это список указателей на фильтрующие функции (специальные функции обратного вызова, определяемые приложением). Когда происходит некоторое событие, связанное с конкретным типом хука, система последовательно передает сообщение каждой фильтрующей функции в цепочке хуков. Действие, которое может выполнить фильтрующая функция, зависит от типа ловушки: некоторые функции могут только отслеживать возникновение событий, другие могут модифицировать параметры сообщений или даже остановить обработку сообщений, заблокировав вызов следующей фильтрующей функции в цепочке хуков или функции обработки сообщений окна-назначения.

Когда к хуку прикреплена одна или более функций-фильтров и происходит событие, приводящее к срабатыванию хука, ОС Windows вызывает первую функцию из очереди функций-фильтров, и на этом ее ответственность заканчивается. Далее функция ответственна за то, чтобы вызвать следующую функцию в цепочке, для чего используется функция Win32 API CallNextHookEx.

ОС поддерживает несколько типов хуков, каждый из которых предоставляет доступ к одному из аспектов механизма обработки сообщений Windows.

Общая схема обработки

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

1. Операционная система при старте создает в системной процессе csrss.exe поток необработанного ввода и системную очередь аппаратного ввода.

2. Поток необработанного ввода в цикле посылает запросы чтения драйверу класса клавиатуры, которые остаются в состоянии ожидания до появления событий от клавиатуры.

3. Когда пользователь нажимает или отпускает клавишу на клавиатуре, микроконтроллер клавиатуры фиксирует нажатие/отпускание клавиши и посылает в центральный компьютер скан-код нажатой клавиши и запрос на прерывание.

4. Системный контроллер клавиатуры получает скан-код, производит преобразование скан-кода, делает его доступным на порту ввода-вывода 60h и генерирует аппаратное прерывание центрального процессора.

5. Контроллер прерываний вызывает процедуру обработки прерывания IRQ 1, — ISR, зарегистрированную в системе функциональным драйвером клавиатуры i8042prt.

6. Процедура ISR считывает из внутренней очереди контроллера клавиатуры появившиеся данные, переводит скан-коды в коды виртуальных клавиш (независимые значения, определенные системой) и ставит в очередь вызов отложенной процедуры I8042KeyboardIsrDpc.

7. Как только это становится возможным, система вызывает DPC, которая в свою очередь вызывает процедуру обратного вызова KeyboardClassServiceCallback, зарегистрированную драйвером класса клавиатуры Kbdclass.

8. Процедура KeyboardClassServiceCallback извлекает из своей очереди ожидающий завершения запрос от потока необработанного ввода и возвращает в нем информацию о нажатой клавише.

9. Поток необработанного ввода сохраняет полученную информацию в системной очереди аппаратного ввода и формирует на ее основе базовые клавиатурные сообщения Windows WM_KEYDOWN, WM_KEYUP, которые ставятся в конец очереди виртуального ввода VIQ активного потока.

10. Цикл обработки сообщений потока удаляет сообщение из очереди и передает его соответствующей оконной процедуре для обработки. При этом может быть вызвана системная функция TranslateMessage, которая на основе базовых клавиатурных сообщений создает дополнительные «символьные» сообщения WM_CHAR, WM_SYSCHAR, WM_DEADCHAR и WM_SYSDEADCHAR.

 


Поделиться с друзьями:

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.