Повторяющиеся символы, использующие отправку ввода в 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, Вы должны убедиться, что вся запись инициализирована.

Кажется, у вас мало причин делать копию входной строки. Вы можете работать с входной строкой напрямую. Ничего не получится сделать копию.

Наконец, вы рассматривали возможность использования автоматизации пользовательского интерфейса вместо фальсификации ввода?

Другие вопросы по тегам