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


 

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

76665. Особенности межгрупповых конфликтов 34.1 KB
  Я надеюсь рассмотренная мною тема а следовательно и накопленный опыт помогут мне и в дальнейшем преодолевать сложные ситуации в жизни сглаживать углы назревающих конфликтов. Это многообразие оснований форм уровней и мотивов конфликтов и обусловливает трудность определения...
76666. Спасательная техника (УДВ-15, УДВ-25, ВФС-2,5, ВФС-10) 791 KB
  Наличие в войсках ГО и формированиях МЧС России техники – условие необходимое, но не достаточное для выполнения поставленных задач. Среди ряда факторов, влияющих на готовность соединений и частей к действию, большое значение имеет техническое состояние техники.
76667. Функциональные особенности организма детей раннего и первого детства и их учет при организации двигательной активности 45.53 KB
  Определение содержания занятий с физического, умственного, нравственного, естетичного и трудового воспитания детей, конкретных знаний, умений и навыков, которые должны быть усвоены детьми на разных возрастных этапах, а также качества, которые необходимо в них воспитывать;
76668. Главные схемы ТЭЦ 43.62 KB
  Таким образом первой особенностью главной схемы ТЭЦ является наличие во многих случаях сборных шин генераторного напряжения к которым присоединяются генераторы ТЭЦ и кабельные линии 6 10 кВ питающие местный район электрической нагрузки.
76669. Станочный парк турбиностроительного предприятия 579.5 KB
  Производство турбин как область технологии машиностроения весьма специфична. Технология турбостроения, обладая признаками отраслевой технологической дисциплины, существенно отличается от технологии общего машиностроения и технологии изготовления тяжелых машин иного назначения.
76670. Выходные дни 32.61 KB
  Одним из главных способов достижения реализации является труд как неоплачиваемый так и оплачиваемый. Выбрав тему реферата Выходные дни мы более подробно познакомимся с особенностями и правилами регулирования отдыха работников.
76671. Уголовная ответственность за экологические преступления 74 KB
  Охрана окружающей природной среды - одна из наиболее актуальных проблем современности. Научно-технический прогресс и усиление антропогенного давления на природную среду неизбежно приводят к обострению экологической ситуации: истощаются запасы природных ресурсов...
76672. Соціально-політичне і економічне становище українських земель у XIV – першій половині XVII століття 47 KB
  Невтомною працею селян підвищувалась урожайність землі її продуктивність. У них пан примушував навколишніх селян молоти зерно беручи за помел побори. Працею сотень селян у яких пан забирав землю в фільварках будували млини комори хліви спиртогорілчані підприємства заводи пивоварні...
76673. Б. А. ТАРАШКЕВІЧ – АЎТАР ПЕРШАЙ “БЕЛАРУСКАЙ ГРАМАТЫКІ” 93 KB
  Мова – гэта не толькі сродак зносін людзей, але і важнейшы элемент нацыянальнай культуры кожнага народа. Гэта і выклікае цікавасць носьбітаў мовы да самой мовы, да яе гісторыі, да вытокаў яе фарміравання і гістарычных умоў функцыянавання...