在 delphi 中使用发送输入的重复字符
Repetitious characters using send input in delphi
我的问题是遵循在 outpot 中显示此字符串 'a-bb-ccc-dddd' 的过程,如 'a-b-c-d'。
我该如何解决?
procedure SendText(const Value: WideString);
var
i: Integer;
S: WideString;
TI, TYY222: TInput;
ki: TKeybdInput;
MyWND: HWND;
const
KEYEVENTF_UNICODE = [=11=]04;
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;
以这种方式在循环中多次调用 SendInput
总是错误的。 SendInput
的全部要点在于它将一系列相关的输入事件进行批处理,并将它们作为一个原子组发送。 SendInput
的文档中明确说明了这一点,我建议您重新阅读。
因此,首先要改变的是使用循环构建输入事件数组,并在循环完成后通过一次调用 SendInput
发送整个数组。
另一个问题是您的代码当前伪造按键按下事件,但忽略了伪造按键弹起事件。您键入的每个字符都涉及按键下降,然后返回。因此,您的数组需要调整大小以包含两倍于字符串中字符的项目。对于每个字符,您需要同时包含按键和按键。在 dwFlags
中包含 KEYEVENTF_KEYUP
以指示按键事件。
我看到的另一个问题是您正在使用未初始化的变量。您设置了 ki
的一些但不是全部字段。您需要确保整个记录都已初始化。
您似乎没有理由复制输入字符串。您可以直接使用输入字符串。复制它没有任何好处。
最后,您是否考虑过使用 UI 自动化而不是伪造输入?
我的问题是遵循在 outpot 中显示此字符串 'a-bb-ccc-dddd' 的过程,如 'a-b-c-d'。 我该如何解决?
procedure SendText(const Value: WideString);
var
i: Integer;
S: WideString;
TI, TYY222: TInput;
ki: TKeybdInput;
MyWND: HWND;
const
KEYEVENTF_UNICODE = [=11=]04;
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;
以这种方式在循环中多次调用 SendInput
总是错误的。 SendInput
的全部要点在于它将一系列相关的输入事件进行批处理,并将它们作为一个原子组发送。 SendInput
的文档中明确说明了这一点,我建议您重新阅读。
因此,首先要改变的是使用循环构建输入事件数组,并在循环完成后通过一次调用 SendInput
发送整个数组。
另一个问题是您的代码当前伪造按键按下事件,但忽略了伪造按键弹起事件。您键入的每个字符都涉及按键下降,然后返回。因此,您的数组需要调整大小以包含两倍于字符串中字符的项目。对于每个字符,您需要同时包含按键和按键。在 dwFlags
中包含 KEYEVENTF_KEYUP
以指示按键事件。
我看到的另一个问题是您正在使用未初始化的变量。您设置了 ki
的一些但不是全部字段。您需要确保整个记录都已初始化。
您似乎没有理由复制输入字符串。您可以直接使用输入字符串。复制它没有任何好处。
最后,您是否考虑过使用 UI 自动化而不是伪造输入?