2017-01-03 3 views
1

Mein Problem ist folgende Prozedur, die diese Zeichenfolge 'a-bb-ccc-dddd' im Outpot wie diese 'a-b-c-d' zeigt. Wie kann ich es beheben.Repetitive Zeichen mit Send-Eingang in 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; 

Antwort

4

Es ist immer ein Fehler SendInput mehrmals in einer Schleife auf diese Weise zu nennen. Der springende Punkt von SendInput ist, dass es eine Reihe von verwandten Eingabeereignissen zusammenfasst und sie als eine atomare Gruppe sendet. Dies wird explizit in der Dokumentation für SendInput angegeben und ich empfehle, dass Sie das erneut lesen.

Die erste Sache, die Sie ändern müssen, besteht darin, mit der Schleife ein Array von Eingabeereignissen zu erstellen und dieses Array mit einem einzigen Aufruf an SendInput in seiner Gesamtheit zu senden, nachdem die Schleife abgeschlossen ist.

Ein anderes Problem besteht darin, dass Ihr Code derzeit die Schlüssel-Down-Ereignisse vortäuscht, aber die Key-Up-Ereignisse nicht vortäuscht. Jedes Zeichen, das Sie eingeben, schließt den Schlüssel ein und dann wieder auf. Daher muss Ihr Array so groß sein, dass es doppelt so viele Elemente enthält wie Zeichen in der Zeichenfolge. Und für jedes Zeichen müssen Sie sowohl die Taste gedrückt als auch gedrückt halten. Fügen Sie KEYEVENTF_KEYUP in dwFlags hinzu, um ein Key-up-Ereignis anzugeben.

Ein weiteres Problem, das ich sehen kann, ist, dass Sie mit nicht initialisierten Variablen arbeiten. Sie haben einige, aber nicht alle Felder von ki festgelegt. Sie müssen sicherstellen, dass der gesamte Datensatz initialisiert wird.

Es scheint wenig Grund für Sie, eine Kopie der Eingabezeichenfolge zu erstellen. Sie können direkt mit der Eingabezeichenfolge arbeiten. Es ist nichts zu gewinnen, wenn man eine Kopie davon macht.

Schließlich haben Sie in Betracht gezogen, UI Automation anstelle von Eingaben zu verwenden?

+0

Danke, ja, ich habe UI Automation verwendet. Ich finde dieses Beispiel [Link] (http://stackoverflow.com/questions/25823685/sendinput-not-working-in-certain-apps-windows-with-delphi), aber es weiß nicht, warum es nicht funktioniert für mich –

+2

Ich finde es ein wenig erstaunlich, dass Sie genau den gleichen Fehler machen wie vom Fragesteller dieser Frage gemacht, und dass Sie den Code aus der Antwort ignorieren. –

+0

Es liegt daran, dass, bevor ich diese Frage gestellt habe, Ihre Antwort auf diese Frage getestet hat. Aber ich habe mehrere Fehler erhalten. Sind Sie sicher, dass Ihre Antwort keinen Fehler für diese Frage hat? –

Verwandte Themen