Использование SendInput вместо keybd_event: повышение эффективности работы с клавиатурой в Delphi
В области разработки программного обеспечения на языке Object Pascal в среде Delphi часто возникает необходимость симуляции нажатий клавиш. Одним из способов реализации такой функциональности является использование функции keybd_event. Однако, стоит отметить, что данная функция работает с виртуальными кодами клавиш, а не с ASCII-кодами, что может привести к путанице при попытке ввода символов.
Проблема и её решение
Проблема заключается в том, что разработчики могут неправильно интерпретировать документацию по функции keybd_event, предполагая, что для ввода символов можно использовать ASCII-коды. Например, код 111 соответствует виртуальной клавише VK_DIVIDE, а не символу 'O'. Для ввода строчной буквы 'O' необходимо убедиться, что включен режим Caps Lock (должен быть выключен), и затем использовать виртуальный код клавиши 4F, который соответствует ASCII-коду 'O'.
Подтверждённый ответ
Документация keybd_event чётко указывает на использование виртуальных кодов, а не ASCII. Это ключевой момент, который важно понимать при работе с функцией ввода.
Альтернативный ответ и преимущества
Кроме того, документация рекомендует избегать использования keybd_event в пользу функции SendInput. SendInput является более современным и эффективным способом отправки ввода пользователя в систему, так как она предоставляет более гибкие возможности для симуляции различных типов ввода, включая клавиатуру, мышь и другие устройства ввода.
Пример кода на Object Pascal (Delphi)
uses
Winapi.Windows;
procedure SendKeyPress(Key: Cardinal; bVK: Boolean; bExtended: Boolean; bChar: Boolean; c: Char);
var
Input: TInput;
begin
Input.Type := $1; // INPUT_KEYBOARD
Input.KI.WVK := Key;
Input.KI.DWExtraInfo := 0;
Input.KI.TIFlags := $0; // KEYEVENTF_EXTENDEDKEY if bExtended else $0
if bVK then
Input.KI.TIFlags := Input.KI.TIFlags or $00000002 // KEYEVENTF_UNICODE if bChar else $00000002
else
Input.KI.WChar := Ord(c);
if bChar then
Input.KI.TIFlags := Input.KI.TIFlags or $0002 // KEYEVENTF_CHAR if bChar else $0000
else
Input.KI.WScan := MapVirtualKey(Key, $02); // MAPVK_VK_TO_VSC
Input.KI.TIFlags := Input.KI.TIFlags or $0008; // KEYEVENTF_KEYUP
SendInput(1, @Input, SizeOf(TInput));
end;
begin
// Ввод клавиши 'O' без учета Caps Lock
SendKeyPress($4F, True, False, False, #0);
end;
Использование SendInput вместо keybd_event позволяет разработчикам создавать более надежные и совместимые с различными версиями Windows программы, а также обеспечивает лучшую совместимость с современными технологиями обработки ввода, такими как технологии защиты от нежелательного ПО (malware) и утилиты для записи макросов, которые могут блокировать старые методы симуляции ввода.
В данной статье мы рассмотрели, как важно правильно понимать различия между ASCII-кодами и виртуальными кодами клавиш при работе с функцией keybd_event, и почему следует отдавать предпочтение функции SendInput для повышения эффективности и безопасности работы с клавиатурой в Delphi.
Использование функции `SendInput` для повышения эффективности симуляции нажатий клавиш в программировании на Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.