在delphi中使用send输入的重复charachters

时间:2017-01-03 11:30:09

标签: delphi character sendinput

我的问题是遵循这个字符串'a-bb-ccc-dddd'在outpot中显示的过程,就像这个'a-b-c-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 个答案:

答案 0 :(得分:4)

以这种方式在循环中多次调用SendInput总是错误的。 SendInput的重点是它批量处理一系列相关的输入事件,并将它们作为原子组发送。这在SendInput的文档中已明确说明,我建议您重新阅读。

首先要改变的是使用你的循环来构建一个输入事件数组,并在循环完成后通过一次调用SendInput完整地发送该数组。

另一个问题是您的代码当前伪造了关键事件,但忽略了伪造关键事件。您键入的每个字符都包含关键字,然后重新启动。因此,您的数组的大小需要包含两倍于字符串中字符的项目。对于每个角色,您需要包括按键和按键。在KEYEVENTF_KEYUP中加入dwFlags表示关键活动。

我可以看到的另一个问题是你正在使用未初始化的变量。您设置了ki的部分但不是全部字段。您需要确保初始化整个记录。

您似乎没有理由复制输入字符串。您可以直接使用输入字符串。制作副本没有任何好处。

最后,您是否考虑过使用UI Automation而不是伪造输入?