Программирование для 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.
Для обычных символьных клавиш виртуальных код
равен нулю. Функциональные клавиши и клавиши
серого цвета имеют виртуальные коды, приведенные
ниже:
Заметьте, что в приведенном выше списке есть коды клавиш, которые отсутствуют на стандартной клавиатуре компьютера, совместимого с 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); Список отдельных флагов вместе с маской для
проверки и кратким описанием мы привели ниже:
Макрокоманда 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; |