在delphi中使用发送输入的重复字符集

问题描述:

我的问题是下面的过程,显示这个字符串'a-bb-ccc-dddd'在outpot中像这样'a-b-c-d'。 我该如何解决它。在delphi中使用发送输入的重复字符集

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; 

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

因此,首先要改变的是使用你的循环来建立一个输入事件数组,然后在你的循环完成后,通过一个简单的调用SendInput来发送这个数组。

另一个问题是,您的代码目前伪造关键事件,但忽略伪造关键事件。你键入的每个字符都包含关键字,然后再回来。所以,你的数组的大小需要包含字符串中字符的两倍。对于每个角色,你需要包括关键和关键。在dwFlags中包含KEYEVENTF_KEYUP以表示关键事件。

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

您似乎没有理由制作输入字符串的副本。您可以直接使用输入字符串。从复制它没有什么可以获得。

最后,您是否考虑使用UI自动化而不是伪造输入?

+0

谢谢,是的,我用UI自动化。我发现这个示例[链接](http://stackoverflow.com/questions/25823685/sendinput-not-working-in-certain-apps-windows-with-delphi),但它不知道为什么它dos'nt工作对我来说 –

+2

我觉得有点惊讶,你犯了与问题提问者完全相同的错误,并且你忽略了答案中的代码。 –

+0

这是因为在我问这个问题之前,测试了你对这个问题的回答。但我收到了多个错误。你确定你的答案在这个问题上有什么错误吗? –