Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для IBM OS/2

© Александр Фролов, Григорий Фролов
Том 25, М.: Диалог-МИФИ, 1993, 286 стр.

[Назад] [Содеожание] [Дальше]

5.1. Сообщение WM_CHAR

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

Скан-код

Аппаратный скан-код содержится в битах 24 - 31 параметра mp1 и имеет 8 разрядов. Приложения редко используют этот код, так как он аппаратно-зависимый. Больший интерес представляет виртуальный код клавиши и код символа.

Тем не менее, при необходимости вы можете извлечь скан-код из параметра mp1 при помощи макрокоманды CHAR4FROMMP, например, так:

nScan = CHAR4FROMMP(mp1);

Виртуальный код клавиши

Виртуальный код нажатой клавиши имеет 16 разрядов и передается в битах 16 - 31 параметра mp2. Для обычных символьных клавиш виртуальных код равен нулю. Функциональные клавиши и клавиши серого цвета имеют виртуальные коды, приведенные ниже:

Клавиша Виртуальный код Значение виртуального кода
Левая клавиша мыши VK_BUTTON1 0x01
Правая клавиша мыши VK_BUTTON2 0x02
Средняя клавиша мыши VK_BUTTON3 0x03
<Break> VK_BREAK 0x04
Забой VK_BACKSPACE 0x05
Табуляция <Tab> VK_TAB 0x06
Обратная табуляция VK_BACKTAB 0x07
Переход на новую строку, клавиша <Enter> основной клавиатуры VK_NEWLINE 0x08
Левая или правая клавиша сдвига <Shift> VK_SHIFT 0x09
Левая или правая клавиша <Control> VK_CTRL 0x0A
Левая клавиша <Alt> VK_ALT 0x0B
Правая клавиша <Alt> VK_ALTGRAF 0x0C
<Pause> VK_PAUSE 0x0D
<Caps Lock> VK_CAPSLOCK 0x0E
<Esc> VK_ESC 0x0F
Пробел VK_SPACE 0x10
Переход на следующую страницу <PgUp> VK_PAGEUP 0x11
Переход на предыдущую страницу <PgUp> VK_PAGEDOWN 0x12
<End> VK_END 0x13
<Home> VK_HOME 0x14
Перемещение курсора влево <Left> VK_LEFT 0x15
Перемещение курсора вверх <Up> VK_UP 0x16
Перемещение курсора вправо <Right> VK_RIGHT 0x17
Перемещение курсора вниз <Down> VK_DOWN 0x18
Печать экрана VK_PRINTSCRN 0x19
Вставка <Insert> VK_INSERT 0x1A
Удаление <Delete> VK_DELETE 0x1B
<Scroll Lock> VK_SCRLLOCK 0x1C
<Num Lock> VK_NUMLOCK 0x1D
<Enter> на дополнительной (цифровой) клавиатуре VK_ENTER 0x1E
Клавиша запроса системы VK_SYSRQ 0x1F
Функциональная клавиша <F1> V K_F1 0x20
- // - <F2> VK_F2 0x21
- // - <F3> VK_F3 0x22
- // - <F4> VK_F4 0x23
- // - <F5> VK_F5 0x24
- // - <F6> VK_F6 0x25
- // - <F7> VK_F7 0x26
- // - <F8> VK_F8 0x27
- // - <F9> VK_F9 0x28
- // - <F10> VK_F10 0x29
- // - <F11> VK_F11 0x2A
- // - <F12> VK_F12 0x2B
- // - <F13> VK_F13 0x2C
- // - <F14> VK_F14 0x2D
- // - <F15> VK_F15 0x2E
- // - <F16> VK_F16 0x2F
- // - <F17> VK_F17 0x30
- // - <F18> VK_F18 0x31
- // - <F19> VK_F19 0x32
- // - <F20> VK_F20 0x33
- // - <F21> VK_F21 0x34
- // - <F22> VK_F22 0x35
- // - <F23> VK_F23 0x36
- // - <F24> VK_F24 0x37
Завершение перемещения VK_ENDDRAG 0x38
Вызов меню VK_MENU VK_F10

Заметьте, что в приведенном выше списке есть коды клавиш, которые отсутствуют на стандартной клавиатуре компьютера, совместимого с IBM PC. В этом нет ничего удивительного, так как в механизм виртуальных кодов клавиш заложена возможность работы и на других платформах.

Виртуальный код клавиши можно получить из параметра mp2 при помощи макрокоманды SHORT2FROMMP :

nVirt = SHORT2FROMMP (mp2);

Код символа

Код символа, соответствующий нажатой символьной клавише, располагается в битах 0 - 15 параметра mp2 и может быть получен при помощи макрокоманды SHORT1FROMMP :

cChar = SHORT1FROMMP (mp2);

Обычные символьные клавиши могут нажиматься одновременно с клавишей сдвига. Код символа, полученный вместе с сообщением WM_CHAR , учитывает состояние клавиши <Shift> в момент, когда была нажата символьная клавиша.

Заметьте, что клавиша <Shift> сама по себе генерирует сообщение WM_CHAR . Поэтому когда вы нажимаете, а затем отпускаете, например, комбинацию клавиш <Shift + a>, в функцию окна приходит четыре сообщения WM_CHAR. Первое соответствует нажатию клавиши <Shift>, второе - нажатию клавиши <a>. Третье и четвертое соответствуют отпусканию указанных клавиш и приходят в той последоваетльности, в которой отпускаются клавиши.

Счетчик повторений

Одинаковые клавиатурные сообщения могут комбинироваться системой Presentation Manager в одно клавиатурное сообщение (например, когда влключается режим автоповтора). Количество скомбинированных таким образом сообщений записывается в поле счетчика повторений, который располагается в битах 16 - 23 параметра mp1. Его можно извлечь при помощи макрокоманды CHAR3FROMMP :

nRepeatCount = CHAR3FROMMP(mp1);

Флаги

Младшие 16 бит параметра mp1 сообщения WM_CHAR содержат флаги, отражающие состояние клавиш в момент генерации сообщения.

Для извлечения флагов из параметра mp1 удобно использовать макрокоманду SHORT1FROMMP :

nFs = SHORT1FROMMP (mp1);

Список отдельных флагов вместе с маской для проверки и кратким описанием мы привели ниже:

Флаг Маска Описание
KC_CHAR 0x0001 Поле кода символа содержит правильное значение
KC_VIRTUALKEY 0x0002 Поле виртуального кода клавиши содержит правильное значение
KC_SCANCODE 0x0004 Поле аппаратного скан-кода клавиши содержит правильное значение
KC_SHIFT 0x0008 Была нажата клавиша <Shift>
KC_CTRL 0x0010 Была нажата клавиша <Control>
KC_ALT 0x0020 Была нажата клавиша <Alt>
KC_KEYUP 0x0040 Сообщение было создано, когда пользователь отпустил нажатую ранее клавишу
KC_PREVDOWN 0x0080 Ранее эта клавиша находилась в нажатом состоянии (устанавливается при выполнении функции автоповтора для клавиши, которую держат в нажатом состоянии достаточно долгое время)
KC_LONEKEY 0x0100 Во время ввода комбинации клавиш отпущена та клавиша, которая была перед этим нажата
KC_DEADKEY 0x0200 Нажата клавиша для создания диактрических символов ("мертвая" клавиша)
KC_COMPOSITE 0x0400 Композитная клавиша, составленная с использованием диактрических символов
KC_INVALIDCOMP 0x0800 Неправильная композитная клавиша
KC_TOGGLE 0x1000 С помощью этого флага можно использвать любую клавишу как переключающую
KC_INVALIDCHAR 0x2000 Неправильный код клавиши
KC_DBCSRSRVD1 0x4000 Зарезервировано для двухсимвольных кодов клавиш
KC_DBCSRSRVD2 0x8000 Аналогично предыдущему

Макрокоманда CHARMSG

Для извлечения отдельных компонент сообщения WM_CHAR удобно использовать макрокоманду CHARMSG , определенную следующим образом:

#define CHARMSG(pmsg) \
   ((PCHRMSG)((PBYTE)pmsg + sizeof(MPARAM) ))

Эта макрокоманда пользуется структурой CHRMSG , показанной ниже:

typedef struct _CHARMSG
{
  USHORT  fs;       // поле флагов
  UCHAR   cRepeat;  // счетчик повторений
  UCHAR   scancode; // скан-код
  USHORT  chr;      // код символа
  USHORT  vkey;     // виртуальный код клавиши
} CHRMSG;
typedef CHRMSG *PCHRMSG;

Ниже мы показали пример использования этой макрокоманды для сохранения всех параметров сообщения WM_CHAR в структуре cm типа CHRMSG:

CHRMSG cm;
cm.chr      = CHARMSG(&msg) ->chr;
cm.vkey     = CHARMSG(&msg) ->vkey;
cm.scancode = CHARMSG(&msg) ->scancode;
cm.cRepeat  = CHARMSG(&msg) ->cRepeat;
cm.fs       = CHARMSG(&msg) ->fs;
[Назад] [Содеожание] [Дальше]