Повідомлення від клавіатури

При натисканні та відпусканні клавіш драйвер клавіатури формує повідомлення і передає їх в системну чергу повідомлень Потім повідомлення від клавіатури надходять в чергу повідомлень програми-власника вікна, має фокус вводу (input focus)

Поняття фокусу введення повязане з активним вікном Вікно, що має фокус введення це або активне вікно, або дочірнє вікно активного вікна Вікно є активним, якщо у нього вьщеліть заголовок, або рамка діалогу, або текст заголовка в панелі завдань для минимизированного вікна Часто дочірніми вікнами для вікна є кнопки, перемикачі та інші елементи управління, причому самі дочірні вікна ніколи не можуть бути активними Якщо фокус уведення знаходиться в дочірньому вікні, то активним є батьківське вікно цього дочірнього вікна Те, що фокус уведення знаходиться в дочірньому вікні, зазвичай показується за допомогою миготливого курсору (для полів редагування), рамки навколо написи на кнопці (для кнопок) або іншими привертають увагу користувача засобами Якщо активне вікно мінімізовано, то вікна з фокусом введення немає

Дізнатися про отримання або втрати фокусу введення вікном можна по информирующим повідомленнями WMSETFOCUS і WMKILLFOCUS Повідомлення WMSETFOCUS показує, що вікно отримало фокус введення, a WMKILLFOCUS що вікно втратило його Визначити або змінити вікно, яке володіє фокусом введення, можливо за допомогою функцій GetFocus і SetFocus

Типи повідомлень, що генеруються драйвером клавіатури, діляться на апаратні і символьні Апаратні повідомлення повязані з натисканням і відпусканням клавіш Кожній клавіші на клавіатурі відповідають два унікальних числа званих скан-кодом натискання і скан-кодом відпускання клавіші Скан-код {scan code) є апарат-ратно-залежним, тобто на клавіатурах різних виробників одна і та ж клавіша може мати різні скан-коди Коли користувач натискає або відпускає клавішу, драйвер клавіатури зчитує з порту 60h відповідний скан-код, який перетворюється драйвером в віртуальний код клавіші {virtual-key code) Цей код є вже апаратно-незалежним, тому в Windows він однозначно ідентифікує натиснуту або відпущену клавішу Завершальним дією драйвера є створення повідомлення, що містить скан-код, віртуальний код клавіші і іншу інформацію про самій / відпущеної клавіші Це апаратне повідомлення поміщається в системну чергу повідомлень Далі Windows витягує повідомлення з системної черги і передає його в чергу повідомлень того потоку, який є власником активного вікна

Віртуальні коди клавіш (virtual key code) визначені у файлі winuserh і наведені в таблиці 11

Апаратні повідомлення бувають системні і несистемні Несистемні апаратні повідомлення це повідомлення натискання клавіші WMKEYDOWN і її відпускання WMKEYUP Якщо натиснення і відпуск клавіші необхідно Windows для своєї обробки, то генеруються системні апаратні повідомлення WMSYSKEYDOWN і WMSYSKEYUP

Ці повідомлення зазвичай виробляються при натисканні клавіш у поєднанні з клавішею і служать для роботи з меню або для системних функцій, таких, наприклад, як зміна активного додатку ()

Додатки зазвичай ігнорують повідомлення WMSYSKEYDOWN і WMSYSKEYUP і передають їх у функцію DefWindowProc, a віконна функція отримує інші повідомлення, що є результатом обробки цих апаратних повідомлень клавіатури (наприклад, WMCOMMAND вибір пункту меню)

Якщо в програмі необхідно обробляти системні повідомлення, то після їх обробки слід викликати DefWindowProc, щоб Windows могла як і раніше їх використовувати

Несистемні повідомлення WMKEYDOWN і WMKEYUP зазвичай виробляються для клавіш, які натискаються і відпускаються без участі клавіші Додаток може використовувати або не використовувати ці повідомлення клавіатури Сама Windows їх проігнорує

Таблиця 11

Шістнадцяткове

значення

Ідентифікатор

Клавіатура IBM

03

VK CANCEL

Ctrl + Break

08

VK BACK

Backspace

09

VK TAB

Tfab

0D

VK RETURN

Enter

10

VK SHIFT

Shift

11

VK CONTROL

Ctrl

12

VK MENU

Alt

13

VK PAUSE

Pause

14

VK CAPITAL

Caps Lock

VK ESCAPE

Esc

20

VK SPACE

Пробіл

21

VK PRIOR

Page Up

22

VK NEXT

Page Down

23

VK END

End

24

VK HOME

Home

25

VK LEFT

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

26

VK UP

Стрілка вгору

27

VK RIGHT

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

28

VK DOWN

Стрілка вниз

VK SNAPSHOT

Print Screen

2D

VK INSERT

Insert

VK DELETE

Delete

30..39

0 .. 9 (на основній клавіатурі)

41 .. 5А

A.Z

70 .. 7В

VK F1..VK F12

F1..F12

90

VK NUMLOCK

Num Lock

91

VK SCROLL

Scroll Lock

Зазвичай повідомлення про натисканні та відпусканні зявляються парами Однак якщо користувач залишить клавішу натиснутою так, щоб включився автоповтор, то Windows посилає віконної процедури серію повідомлень WMKEYDOWN (Або WMSYSKEYDOWN) і одне повідомлення WMKEYUP (або WMSYSKEYUP), коли, зрештою, клавіша буде відпущена Додаток за допомогою функції GetMessageTime може дізнатися час натискання і відпускання клавіші щодо старту системи

Для всіх апаратних повідомлень клавіатури 32-розрядна змінна lParam, передана у віконну процедуру, складається з шести полів:

– лічильника повторень (число натиснень клавіші)

– скан-коду OEM (Original Equipment Manufacturer)

– прапора розширеної клавіатури (1, якщо повідомлення клавіатури зявилося в результаті роботи з додатковими клавішами розширеної клавіатури IBM)

– коду контексту (1, якщо натиснута клавіша )

– прапора попереднього стану клавіші (0, якщо в попередньому стані клавіша була відпущена, і 1, якщо в попередньому стані вона була натиснута),

– прапора стану клавіші (0, якщо клавіша натискається, і 1, якщо клавіша відпускається)

Набагато більш важливим параметром апаратних повідомлень клавіатури, в порівнянні з lParam, є параметр wParam У цьому параметрі міститься віртуальний код клавіші, що використовується додатком для ідентифікації клавіші

Параметри wParam і lParam апаратних повідомлень клавіатури нічого не повідомляють про стан так званих клавіш зсуву (, , ) і клавіш-перемикачів (, , )

Додаток може отримати поточний стан (натиснута чи ні) будь віртуальної клавіші за допомогою функцій GetKeyState і GetAsyncKeyState

Функція GetKeyState відображає стан клавіатури не в реальному часі, а тільки в момент, коли останнє повідомлення від клавіатури було вибрано з черги Ця функція не дозволяє отримувати інформацію про клавіатурі незалежно від звичайних повідомлень від клавіатури, спочатку додаток повинен отримати повідомлення від клавіатури, а потім викликати GetKeyState для визначення стану клавіш Така синхронізація дає перевагу, якщо потрібно дізнатися положення перемикача для конкретного повідомлення клавіатури, навіть якщо повідомлення обробляється вже після того, як стан перемикача було змінено

Якщо дійсно потрібна інформація про поточний стан клавіші, то можна використовувати функцію GetAsyncKeyState

Так як при обробці подій клавіатури необхідно формувати символи, відповідні самій клавіші, то драйвер клавіатури крім апаратних формує символьні повідомлення Будь-яка клавіша, наприклад, , в залежності від стану клавіш , і , може використовуватися для генерації різних символів сатиричного s або прописні S. Додатком надсилаються обидва апаратних і символьне повідомлення WMCHAR

Самостійне перетворення апаратних повідомлень клавіатури в символьні повідомлення з довідника не рекомендується, так як необхідно знати про особливості реалізації кожної окремої національної клавіатури Це перетворення пропонується зробити самій Windows за допомогою функції TranslateMessage в циклі обробки повідомлень:

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

{

TranslateMessage(&ampmess)

DispatchMessage(&ampmess) }

Функція GetMessage заповнює поля структури mess даними наступного повідомлення з черги Виклик DispatchMessage організовує передачу управління віконної функції Між двома цими функціями знаходиться виклик функції TranslateMessage, яка перетворює апаратні повідомлення в символьні Якщо цим повідомленням є WMKEYDOWN (WMSYSKEYDOWN) і, якщо натиснення клавіші в поєднанні з положенням клавіші зсуву генерує символ, тоді TranslateMessage поміщає символьне повідомлення в чергу повідомлень

Це символьне повідомлення буде наступним після повідомлення про натискання клавіші, яке функція GetMessage витягне з черги

Так само, як і для апаратних повідомлень, символьні повідомлення бувають несистемні WMCHAR, WMDEADCHAR і системні -WMSYSCHAR, WMSYSDEADCHAR

Повідомлення WMSYSCHAR і WMSYSDEADCHAR є наслідком повідомлень WMSYSKEYDOWN У більшості випадків можна обробляти тільки WMCHAR

Параметр lParam для WMCHAR збігається з lParam апаратного повідомлення клавіатури, з якого згенеровано символьне повідомлення Параметр wParam це код символу ASCII

Повідомлення WMDEADCHAR і WMSYSDEADCHAR генеруються для неамериканських клавіатур з діакритичними знаками для

букв Ці знаки називаються німими клавішами (dead keys), оскільки самі по собі клавіші з діакритичними знаками не визначають символ

Розглянемо, з якими наборами символів працює система Windows Для забезпечення можливості роботи з символами кирилиці фірма Microsoft розробила розширений набір символів з кирилицею набір символів OEM (Original Equipment Manufacturer) Сама ж Windows для представлення символів використовує набір символів ANSI У цьому наборі визначені не всі коди і відсутні символи псевдографіки

За замовчуванням для відображення символів вибирається системний шрифт, для якого використовується набір символів ANSI

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*