68906

Клавиатура

Лекция

Информатика, кибернетика и программирование

Таким образом программа получает только адресованные ей сообщения от клавиатуры. Возникает вопрос: Windows многозадачное приложение и одновременно в системе могут работать несколько программ и соответственно открыты несколько окон какое же из окон будет получать сообщения от клавиатуры...

Русский

2014-09-27

59.5 KB

1 чел.

Лекция 5

Клавиатура

 Общие сведения

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

Сообщение от клавиатуры проходит две очереди прежде, чем попадет в вашу программу – системную очередь сообщений и очередь сообщений приложения. Из системной очереди Windows выбирает сообщения, предназначенные исключительно ей (например, что нажата перегрузка машины <Ctrl+Alt+Del> или переключение между приложениями <Alt+Tab>). Таким образом, программа получает только адресованные ей сообщения от клавиатуры.

Возникает вопрос: Windows – многозадачное приложение и одновременно в системе могут работать несколько программ и, соответственно, открыты несколько окон, - какое же из окон будет получать сообщения от клавиатуры? Ответ – окно, которое имеет фокус ввода (“input focus”). Концепция фокуса ввода тесно связана с концепцией активного окна. Активное окно – это окно, имеющее фокус ввода, либо имеющее дочернее окно, которое имеет фокус ввода. Только одно окно в данный момент времени может быть активным. В этом случае, фокус ввода принадлежит либо данному окну, либо одному из дочерних окон активного окна (если они существуют).

Когда любое окно получает от системы сообщение WM_SETFOCUS, это означает, что окно получает фокус ввода. Теперь все сообщения от клавиатуры будут посылаться в данное окно. Окно теряет фокус ввода, когда его оконная процедура получает сообщение WM_KILLFOCUS.

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

Аппаратные сообщения.

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

Операционная система выделяет в потоке аппаратных сообщений системные и несистемные сообщения. Системные сообщения обычно вырабатываются при нажатии клавиш в сочетании с клавишей <Alt>. Эти сообщения вызывают опции меню программы или системного меню (<Alt+функциональная клавиша>, <Alt+Esc>), или используются для системных функций, таких как смена активного окна (<Alt+Tab>). Обычно программа игнорирует системные сообщения, однако иногда возникает необходимость  в их обработке.

Типы сообщений, поступающих в приложение от клавиатуры приведены в следующей таблице:

Типы сообщений

Клавиша нажата

Клавиша отпущена

Несистемные аппаратные сообщения

WM_KEYDOWN

WM_KEYUP

Системные аппаратные сообщения

WM_SYSKEYDOWN

WM_SYSKEYUP

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

Одновременно с одним из аппаратных сообщений приходят два параметра сообщения: lParam и wParam. Переменная lParam состоит из 6 полей:

Код контекста

                                   Зарезервировано           Скан - код   Счетчик повторений

Флаги  состояния клавиши                                       Флаг расширенной клавиатуры

Счетчик повторений. Равен числу нажатий клавиши, которое отражено в сообщении. В случае, когда его значение отлично от 1 (больше одного нажатия), это обычно означает, что программа не успевает обработать сообщения в реальном времени, либо система загружена в данный момент какой-либо работой. Ваша программа может как игнорировать число нажатий (реагировать только на сам факт нажатия), либо обрабатывать все нажатий клавиши клавиатуры.

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

Флаг расширенной клавиатуры. Устанавливается в 1, если сообщение пришло от дополнительной клавиатуры (клавиши управления курсором, цифровая клавиатура и др.)

Код контекста. Код контекста устанавливается в 1, если нажата клавиша <Alt>. Часто, при помощи этого бита можно выделить системные сообщения.

Флаг предыдущего состояния клавиши. Равен 0, если в предыдущем состоянии клавиша была отпущена, и 1, если в предыдущем состоянии она была нажата.

Флаг состояния клавиши. Равен 0, если клавиши нажимается, и 1, если клавиша отпускается.

Второй параметр wParam содержит виртуальный код клавиши (virtual key code), идентифицирующий нажатую и отпущенную клавишу, чем реализуется аппаратная независимость программного представления клавиатуры. Виртуальные коды клавиш, которые вы используете, имеют имена, определенные в заголовочных файлах Windows. Вот несколько примеров виртуальных кодов:

Нажатая клавиша

Идентификатор, определенный в windows.h

Десятичный код

Ctrl-Break

VK_CANCEL

3

Tab (табуляция)

VK_TAB

9

Shift

VK_SHIFT

13

Enter

VK_ENTER

16

Ctrl

VK_CONTROL

17

Alt

VK_MENU

18

Esc

VK_ESCAPE

27

Пробел

VK_SPACE

32

Стрелка влево

VK_LEFT

37

Стрелка вправо

VK_RIGHT

38

Стрелка вниз

VK_DOWN

40

Стрелка вверх

VK_UP

39

Delete

VK_DELETE

46

End

VK_END

35

Home

VK_HOME

36

Page Up

VK_PRIOR

33

Page Down

VK_NEXT

34

F1

VK_F1

70

Получение времени нажатия клавиши и состояния управляющих клавиш.

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

Существует ряд управляющих клавиш, от состояния которых зависит реакция системы (и программ) на нажатие остальных клавиш. К таким клавишам относятся: (<Shift>, <Ctrl>, <Alt>, <CapsLock>, <NumLock>, <ScrollLock>). Программа может получить их состояния с помощью функции GetKeyState. Например, для получения состояния SHIFT необходимо выполнить:

 GetKeyState(VK_SHIFT);

где в качестве параметра выступает виртуальный код нужной управляющей клавиши.

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

Символьные сообщения.

Ранее уже говорилось, что знания о виртуальном коде и положениях управляющих клавиш недостаточно для определения нажатого символа. Операционная система позволяет поддерживать большое число национальных клавиатур, алфавит которых может значительно отличаться друг от друга. В связи с этим, нажатие одной и той же клавиши может означать нажатие разных символов, определяемых выбранным в данный момент драйвером клавиатуры. Например, нажатие клавиши с буквой “V”, при выбранном драйвере русской или украинской клавиатуры, будет означать нажатие символа “М”.

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

while (GetMessage(&msg, NULL, 0, 0))

{

 TranslateMessage(&msg);

 DispatchMessage(&msg);

}

Функция TranslateMessage является своеобразным диспетчером сообщений. Если очередное сообщение, выбранное функцией GetMessage из очереди сообщений, является символьным, то TranslateMessage ставит в очередь сообщений к приложению еще одно сообщение – символьное. При этом, аппаратное сообщение продолжает свой путь в цикле обработки сообщений и попадает в оконную процедуру окна приложения через функцию DispatchMessage.

Аналогично аппаратным сообщениям, существует четыре символьных сообщения:

Типы сообщений

Клавиша нажата

Клавиша отпущена

Несистемные символьные сообщения

WM_CHAR

WM_DEADCHAR

Системные символьные сообщения

WM_SYSCHAR

WM_DEADCHAR

Сообщения WM_CHAR являются следствием сообщений WM_KEYDOWN. В большинстве приложений предпочтительным является использование именно символьных сообщений. Параметр lParam, в случае сообщения WM_CHAR, является таким же, как и  соответствующий параметр в аппаратном сообщении, а wParam – определяет код символа ASCII.

В качестве примера рассмотрим случай, когда пользователь программы нажимает и отпускает клавишу "А". Если переключатель <CapsLock> не включен и не нажата клавиша  <Shift>, то оконная процедура получит три следующих сообщения:

Сообщение   Клавиша или код

WM_KEYDOWN Виртуальная клавиша "А"

WM_CHAR  ASCII код "а"

WM_KEYUP  Виртуальная клавиша "А"

Если вы нажимаете "А" при нажатой клавише <Shift>,  то оконная процедура получит следующий ряд сообщений:

Сообщение   Клавиша или код

WM_KEYDOWN Виртуальная клавиша VK_SHIFT

WM_KEYDOWN Виртуальная клавиша "А"

WM_CHAR  ASCII код "А"

WM_KEYUP  Виртуальная клавиша "А"

WM_KEYUP  Виртуальная клавиша VK_SHIFT

Символьные сообщения приходят в программу не только, когда пользователь нажимает клавиши с буквами. Например, нажатие табуляции приведет к приходу символьного сообщения с кодом '\t', возврата каретки - '\r', забоя – '\b'.

Каретка.

Возвращаясь к обсуждению концепции "фокуса ввода", вспомним, что сообщения клавиатуры приходит в окно, являющееся активным и имеющее "фокус ввода". Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, программа может определить, имеет ли она фокус ввода, или нет.

Работая с реальными программами, например, с текстовыми редакторами, вам часто необходимо определить также то место внутри окна, куда необходимо осуществлять ввод информации. Когда вы набираете текст, то, как правило, какой-либо символ (например, мигающий прямоугольник, либо символ подчеркивания) показывает вам место, где следующий набираемый вами символ появится на экран. Ваша программа может сама следить за рисованием, управлением данным символом в зависимости от действий пользователя. Однако, Windows предоставляет вам предопределенный объект, реализующий перечисленные функции, и носящий имя "каретка" (caret).

Каретка является общесистемным ресурсом (как, впрочем, и курсор, который связан с мышью), единственным в операционной системе, и может использовать только окном, имеющим фокус ввода. Поэтому, основным правилом использования каретки является следующее: оконная процедура вызывает функцию CreateCaret при обработке сообщения WM_SETFOCUS (получении фокуса ввода), и функцию DestroyCaret при обработке сообщения WM_KILLFOCUS (потере фокуса).

Приведем основные функции работы с кареткой:

CreateCaret(hWnd, pImage, cxChar, cyChar); // создание каретки

SetCaretPos(cxChar, cyChar); // установить позицию каретки в позицию cxChar, cyChar

GetCaretPos(); // получить положение каретки

GetCaretBlinkTime(); // Получение частоты мигания

SetCaretBlinkTime(); // Установка частоты мигания

ShowCaret(hWnd); // показать каретку

HideCaret(hWnd); // спрятать каретку

DestroyCaret(); // удалить каретку


31    30     29     28     27     26     25     24     23    . . . .  17     16     15     14 . . . . .   0


 

А также другие работы, которые могут Вас заинтересовать

26779. Уточнение корней уравнения. Метод деления отрезка пополам, метод секущих 204.5 KB
  Детальный уровень включает в себя все характеристики среднего уровня с оценкой влияния данных характеристик на каждый этап процесса разработки ПО Организация работы модели в системе GPSS. Операторыблоки формируют логику функционирования модели. Управляющие операторы служат для контроля и управления процессом моделирования прогоном модели. В процессе моделирования транзакты €œсоздаются€ заявки поступают и €œуничтожаются€ заявки уходят так как это необходимо по логике модели.
26780. Аппроксимация функций 101.5 KB
  Конкретные модели файлов используемые в системе управления файлами мы рассмотрим далее когда перейдем к физическим способам организации баз данных а на этом этапе нам достаточно знать что пользователи видят файл как линейную последовательность записей и могут выполнить над ним ряд стандартных операций: создать файл требуемого типа и размера; открыть ранее созданный файл; прочитать из файла некоторую запись текущую следующую предыдущую первую последнюю; записать в файл на место текущей записи новую добавить новую запись в...
26781. Обобщение простейших формул численного интегрирования 188.5 KB
  Основные особенности протокола TCP. TCP Transfer Control Protocol – протокол контроля передачи протокол TCP применяется в тех случаях когда требуется гарантированная доставка сообщений. Первая и последняя версия TCP RFC793 Transmission Control Protocol J. Модуль TCP нарезает большие сообщения файлы на пакеты каждый из которых передается отдельно на приемнике наоборот файлы собираются.
26782. Простейшие формулы численного интегрирования 276.5 KB
  Задача Коши для системы 4.13 может быть сведена к задаче Коши для системы дифференциальных уравнений. Системы можно разделять на классы по различным признакам. Цель любой классификации – ограничить выбор подходов к отображению системы и дать рекомендации по выбору методов ее исследования.
26783. Методы отделения корней уравнения 140 KB
  Основной принцип технологии клиент сервер применительно к технологии баз данных заключается в разделении функций стандартного интерактивного приложения на 5 групп имеющих различную природу: функции ввода и отображения данных Presentation Logic; прикладные функции определяющие основные алгоритмы решения задач приложения Business Logic; функции обработки данных внутри приложения Database Logic функции управления информационными ресурсами Database Manager System; служебные функции играющие роль связок между функциями первых...
26784. Одномерные задачи оптимизации 95.5 KB
  Строки отношения называются кортежами. Количество атрибутов в отношении называется степенью или рангом отношения. Поэтому вводится понятие экземпляра отношения которое отражает состояние данного объекта в текущий момент времени и понятие схемы отношения которая определяет структуру отношения. Схемой отношения R называется перечень имен атрибутов данного отношения с указанием домена к которому они относятся: SR = А1 А2 Аn Аi Di Если атрибуты принимают значения из одного и того же домена то они называются Qсравпимыми где Q ...
26785. Численное дифференцирование. Древовидная структура доменных имен 83 KB
  Для организационных систем и ИС удобно в определении системы учитывать цели и планы внешние и внутренние ресурсы исполнителей непосредственно процесс помехи контроль управление и эффект. Интегративное свойство системы обеспечивает ее целостность качественно новое образование по сравнению с составляющими ее частями. Под элементом принято понимать простейшую неделимую часть системы. Любой элемент системы можно рассматривать как самостоятельную систему математическую модель описывающую какойлибо функциональный блок или аспект изучаемой...
26786. Задачи линейного программирования 432.5 KB
  Поэтому центральным понятием в области баз данных является понятие модели. В соответствии с рассмотренной ранее трехуровневой архитектурой мы сталкиваемся с понятием модели данных по отношению к каждому уровню. Физические модели данных основанные на страничной организации являются наиболее перспективными. Классификация моделей данных Наибольший интерес вызывают модели данных используемые на концептуальном уровне.
26787. Аппроксимация функций 112.5 KB
  Особенности данного этапа: Практически все современные СУБД обеспечивают поддержку полной реляционной модели а именно: структурной целостности допустимыми являются только данные представленные в виде отношений реляционной модели; языковой целостности то есть языков манипулирования данными высокого уровня в основном SQL; ссылочной целостности контроля за соблюдением ссылочной целостности в течение всего времени функционирования системы и гарантий невозможности со стороны СУБД нарушить эти ограничения. отделение организации от...