Повторяющиеся символы, использующие отправку ввода в Delphi
Моя проблема заключается в следующей процедуре, которая показывает эту строку "a-bb-ccc-dddd" в outpot, как этот "abc-d". Как я могу это исправить.
procedure SendText(const Value: WideString);
var
i: Integer;
S: WideString;
TI, TYY222: TInput;
ki: TKeybdInput;
MyWND: HWND;
const
KEYEVENTF_UNICODE = $0004;
begin
S := (Value);
TI.Itype := INPUT_KEYBOARD;
for i := 1 to Length(S) do
begin
ki.wVk := 0;
ki.dwFlags := KEYEVENTF_UNICODE;
ki.wScan := Ord(S[i]);
TI.ki := ki;
SendInput(1, TI, SizeOf(TI));
end;
end;
1 ответ
Это всегда ошибка, чтобы позвонить SendInput
несколько раз в цикле таким образом. Весь смысл SendInput
является то, что он объединяет ряд связанных входных событий и отправляет их в виде атомарной группы. Это прямо указано в документации для SendInput
и я рекомендую вам перечитать это.
Поэтому первое, что нужно изменить, - это использовать ваш цикл для создания массива входных событий и полностью передать этот массив с помощью одного вызова SendInput
, сделанный после завершения вашего цикла.
Другая проблема заключается в том, что ваш код в настоящее время подделывает события нажатия клавиши, но не подделывает события нажатия клавиши вверх. Каждый вводимый вами символ включает нажатие клавиши, а затем возвращение вверх. Таким образом, ваш массив должен иметь такой размер, чтобы он содержал в два раза больше элементов, чем символов в строке. И для каждого персонажа вам нужно включить и клавишу вниз, и клавишу вверх. Включают KEYEVENTF_KEYUP
в dwFlags
для обозначения события Key Up.
Еще одна проблема, которую я вижу, это то, что вы работаете с неинициализированными переменными. Вы устанавливаете некоторые, но не все поля ki
, Вы должны убедиться, что вся запись инициализирована.
Кажется, у вас мало причин делать копию входной строки. Вы можете работать с входной строкой напрямую. Ничего не получится сделать копию.
Наконец, вы рассматривали возможность использования автоматизации пользовательского интерфейса вместо фальсификации ввода?