Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
uchebnik.docx
Скачиваний:
0
Добавлен:
10.01.2020
Размер:
557.61 Кб
Скачать

1.2.4.1.1 Ввод данных с клавиатуры

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

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

ОС помещает сообщения клавиатуры в очередь сообщений потока, находящегося на переднем плане, который создал окно с фокусом ввода. Фокус ввода - временное свойство окна. ОС предоставляет доступ к клавиатуре всем окнам на дисплее, путем перемещения фокуса ввода от одного окна к другому по воле пользователя. Окно, имеющее фокус ввода, получает все сообщения клавиатуры (из очереди сообщений потока, который создал это окно) до тех пор, пока фокус ввода не переместится на другое окно.

Поток может вызвать функцию GetFocus для определения, какое из окон в текущий момент времени имеет фокус ввода. Поток может поместить фокус ввода на одно из своих окон с помощью функции SetFocus. При изменении положения фокуса ввода, ОС посылает сообщение WM_KILLFOCUS тому окну, которое потеряло фокус ввода, а затем посылает сообщение WM_SETFOCUS тому окну, на которое перешел фокус ввода.

Концепция фокуса ввода связана с понятием активное окно. Активное окно - окно верхнего уровня, с которым работает пользователь. Окно, обладающее фокусом ввода является либо активным окном, либо порожденным окном активного окна. Чтобы пользователь мог определить, какое окно является активным, ОС выделяет заголовок окна (если он есть) или перемещает его на передний план.

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

Для блокировки ввода от клавиатуры и мыши используется функция BlockInput. В качестве входного параметра задается логическое значение, определяющее заблокировать ввод (если входной параметр имеет значение ИСТИНА) или разблокировать ввод (если входной параметр имеет значение ЛОЖЬ). Необходимо отметить, что разблокировать заблокированный ввод может успешно только тот поток, который и заблокировал ввод.

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

Когда пользователь нажимает на клавиши, оконная процедура окна, имеющего фокус ввода получает сообщения о нажатии клавиши. Сообщений о нажатии клавиш всего 4: WM_KEYDOWN (клавиша нажата), WM_KEYUP (клавиша отпущена), WM_SYSKEYDOWN (нажата системная клавиша) и WM_SYSKEYUP (системная клавиша отпущена). Обычно, оконная процедура игнорирует все сообщения о нажатии клавиши за исключением сообщения WM_KEYDOWN.

Когда оконная процедура получает сообщение WM_KEYDOWN, она должна обработать нажатие клавиши в соответствии со значением кода виртуальной клавиши. Код виртуальной клавиши находится в параметре wParam сообщения WM_KEYDOWN. Обычно, приложения обрабатывает только нажатия клавиш, сгенерированные несимвольными клавишами (т.е. функциональными клавишами, клавишами управления курсора и т.п.). В параметре lParam сообщения WM_KEYDOWN содержит дополнительную информацию (например, счетчик повторений, если пользователь нажал и удерживает клавишу). Любой поток, который получает символьный ввод от пользователя, должен включать функцию TranslateMessage в цикл обработки сообщений. Эта функция проверяет код виртуальной клавиши сообщения о нажатии клавиши и, если код соответствует какому-либо символу, помещает сообщение с символом в очередь сообщений. Сообщение с символом обрабатывается и удаляется в следующей итерации цикла обработки сообщений, параметр wParam этого сообщения содержит код символа.

В основном, цикл обработки сообщений потока должен использовать функцию TranslateMessage для обработки каждого сообщения, а не только сообщений виртуальных клавиш. Хотя функция TranslateMessage и не воздействует никаким образом на другие типы сообщений, она гарантирует, что сообщения с клавиатуры будут обработаны корректно.

Как уже говорилось выше, оконная процедура получает сообщение с символом после того, как функция TranslateMessage преобразует код виртуальной клавиши в код символа. Существует 4 типа сообщений с символами: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR и WM_SYSDEADCHAR.

Типичная оконная процедура игнорирует все сообщения с символами за исключением сообщения WM_CHAR. Это сообщение формируется функцией TranslateMessage когда пользователь нажимает одну и следующих клавиш:

  • Любую символьную клавишу

  • BACKSPACE

  • ENTER

  • ESC

  • SHIFT+ENTER

  • TAB

Когда оконная процедура получает сообщение WM_CHAR, она должна проверить код символа и в зависимости от его значения определить, как обработать символ. Код символа передается в параметре wParam.

Пример использования функции TranslateMessage можно обнаружить в приложении А.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]