keybd событие KEYEVENTF EXTENDEDKEY объяснение требуется

на документация Он говорит:

KEYEVENTF_EXTENDEDKEY (0x0001): если указан, код сканирования предшествовал префиксному байту со значением 0xE0 (224).

может кто-нибудь объяснить, что это значит?

в чем разница между этим:

keybd_event(RIGHT, 0, 0, 0);
keybd_event(RIGHT, 0, 2, 0);

и так:

keybd_event(RIGHT, 0, 1 | 0, 0);
keybd_event(RIGHT, 0, 1 | 2, 0);

потому что когда я выполнить этот код, я не вижу никакой разницы?

кроме того, что такое "byte bScan" для? В описание это: аппаратный код сканирования для ключа. Что это значит?

3 ответов


простое (и неполное) объяснение заключается в том, что KEYEVENTF_EXTENDEDKEY означает "это нажатие клавиши с цифровой клавиатуры"

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

программы, которые обращают внимание на расположение ключа обычно реагируют на этот флаг.

значение bScan является необработанным аппаратным scancode. Для объяснения scancodes смотрите здесь http://en.wikipedia.org/wiki/Scancode. Как и расширенный флаг ключа, большинство программ не обращают внимания на scancodes. Значения есть в случае, если программа хочет рассматривать клавиатуру как кучу кнопок.


Это древняя деталь реализации раскладок клавиатуры на оригинальном IBM PC. Вот как выглядела клавиатура в 1981 году:

enter image description here

не очень похоже на клавиатуру, как сегодня. Это эволюционировало, дополнительные клавиши были добавлены как выделенные клавиши курсора и клавиши Ctrl и Alt справа от пробела. Чтобы сохранить совместимость с существующим программным обеспечением, которое непосредственно читает клавиатуру (очень распространенное преступление в те дни), клавиатура контроллер сообщает те продлен ключи с тем же кодом сканирования, но дополнительный специальный байт впереди него. Таким образом, правые клавиши Ctrl и Alt работали так же, как и левые, если программа заботится о различии, она может обнаружить разницу от префиксного байта. Это 0xe0 заключается в том, что префикс.

многие программы не заботятся о том, какой конкретный ключ вы нажали, они просто используют виртуальный код ключа и не заботятся о том, является ли он расширенным ключом. Как те старые MS-Dos программы-нет. Вот почему вы не видите разницы. И поскольку вы не указали код сканирования, это не могу сделать разницу. Подробный документ от Microsoft, описывающий коды сканирования клавиатуры, -здесь.


оба ответа здесь не правы. Я не понимаю, почему люди голосуют за неправильные ответы ??

оба ответа предполагают, что флаг не имеет никакого отношения. Это совершенно неправильно. И флаг не имеет ничего общего с клавиатурой.

правильный ответ заключается в том, что есть только коды сканирования от 01 до 7F, но виртуальные ключи варьируются от 01 до FF.

так как клавиатуры выросли, стало необходимым, чтобы некоторые коды сканирования имели двойное назначение. Например, на моей клавиатуре сканирование код 0x45 присваивается клавише NumLock и клавише Pause.

чтобы различить их, keyborard отправляет флаг расширенного ключа для ключа NumLock, но не для ключа паузы.

есть несколько других ключей, которые имеют двойное назначение, например, все медиа-ключи.

запустите Spy++, который поставляется с инструментами Visual Studio, и отфильтруйте только WM_KEYDOWN и включите "параметры декодированного сообщения", затем нажмите некоторые клавиши в текстовом редакторе.

Spy++, которая будет показать, для каких клавиш установлен флаг и для каких клавиш он не установлен.

здесь вывод из Spy++:

P WM_KEYDOWN nVirtKey:VK_NUMLOCK cRepeat:1 ScanCode:45 fExtended:1 fAltDown:0 fRepeat:0 fUp:0
P WM_KEYDOWN nVirtKey:VK_PAUSE cRepeat:1 ScanCode:45 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

Другим примером является код сканирования 2E, который присваивается букве " C " и VK_VOLUME_DOWN на моей клавиатуре.

вы должны запрограммировать его точно так же, иначе инъекция клавиатуры с keybd_event() не удастся, потому что другой ключ попадает, чем тот, который вы намеревались.

Do не доверие MapVirtualKeyEx(MAPVK_VK_TO_VSC_EX) (>=Vista) потому что он не возвращает расширенный флаг для некоторых ключей, хотя они являются расширенными ключами, например VK_LEFT. Еще одна ошибка в этой функции заключается в том, что она возвращает расширенный флаг (E1) для ключа VK_PAUSE, хотя этот ключ не расширен.