2017-01-03 9 views
1

私の問題は、 'a-b-c-d'のようなアウトポットにこの文字列 'a-bb-ccc-dddd'を表示する手順です。 どうすれば修正できますか?デルファイでsend inputを使用している反復的なcharachters

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; 

答えて

4

その方法で、ループ内でSendInputを複数回呼び出すことが常に間違いです。 SendInputの全体のポイントは、一連の関連する入力イベントをバッチ処理し、それらを原子グループとして送信することです。これはSendInputのドキュメントに明示的に記載されています。再読み込みすることをお勧めします。

最初に変更する必要があるのは、ループを使用して入力イベントの配列を作成し、ループが完了した後にSendInputを1回呼び出してその配列全体を送信することです。

もう1つの問題は、コードが現在キーダウンイベントを偽造しているが、キーアップイベントを偽造することを省略していることです。入力した各文字には、キーがダウンしてから復帰することが含まれます。したがって、配列は、文字列内の文字の数の2倍の大きさにする必要があります。それぞれのキャラクターには、キーダウンとキーアップの両方を含める必要があります。キーアップイベントを示すにはdwFlagsKEYEVENTF_KEYUPを含めます。

もう1つの問題は、初期化されていない変数で作業していることです。一部のフィールドはkiに設定します。レコード全体が初期化されていることを確認する必要があります。

入力文字列のコピーを作成する理由はほとんどありません。入力文字列を直接操作できます。それをコピーして得られるものは何もありません。

最後に、入力を偽装する代わりにUIオートメーションを使用することを検討しましたか?

+0

ありがとうございました。はい、私はUIオートメーションを使用しました。私はこのサンプルを見つける[リンク](http://stackoverflow.com/questions/25823685/sendinput-not-working-in-certain-apps-windows-with-delphi)それはdo'ntなぜdos'nt仕事を知っている私のために –

+2

私はあなたがその質問の質問者が行ったのとまったく同じ間違いをして、答えのコードを無視していることをちょっと驚かせることができます。 –

+0

私はこの質問をする前に、その質問のあなたの答えをテストしたからです。しかし、私は複数のエラーを受けました。あなたはあなたの答えdos'ntがその質問の間違いを持っ​​ていることを確かですか? –

関連する問題