8

C#を使用してキーストロークを送信する最速の方法は何でしょうか。現在、とを使用SendKeys.Send()SendKeys.SendWait()ていSendKeys.Flush()ます。

次のコードを使用して、両方が機能するのにかかる時間を計算しています。

Stopwatch sw1 = new Stopwatch();
sw1.Start();
for (int a = 1; a <= 1000; a++)
{
    SendKeys.Send("a");
    SendKeys.Send("{ENTER}");
}
sw1.Stop();

と:

Stopwatch sw2 = new Stopwatch();
sw2.Start();
for (int b = 1; b <= 1000; b++)
{
    SendKeys.SendWait("b");
    SendKeys.SendWait("{ENTER}");
    SendKeys.Flush();
}
sw2.Stop();

2つの結果は次のとおりです。

Result 1: 40119 milliseconds
Result 2: 41882 milliseconds

ここSendKeys.Flush()で、ループの外側で2番目のテストを実行すると、次のようになります。

Result 3: 46278 milliseconds

コードのこれらの変更によって速度が大きく異なるのはなぜだろうと思っていました。

私のアプリケーションは多くのことを行うので、多くのキーストロークを送信するより速い方法があるかどうかも疑問に思いました。(これらのテストは非常に遅いネットブックで行われました)

ありがとう!

4

2 に答える 2

12

クライアントにプッシュするテキストがたくさんある場合は、SendKeysが非常に遅いことに気付くかもしれません。クリップボードを使用すると、処理を大幅に高速化できます。「入力」するテキストをクリップボードのターゲットテキストボックスに入力し、CTRL-Vをターゲットアプリケーションに送信してそのテキストを貼り付けるという考え方です。これがイラストです:

Clipboard.Clear();  // Always clear the clipboard first
Clipboard.SetText(TextToSend);
SendKeys.SendWait("^v");  // Paste

これは、GoogleChromeで実行されているWebアプリに長いバーコードを送信するホストアプリとWiFi経由で通信するコードレスバーコードスキャナーでうまく機能することがわかりました。それは、退屈な30桁の数字を約4秒で突き出すことから、瞬時にすべてを1秒未満で貼り付けることへと移行しました。

明らかな欠点の1つは、これがユーザーによるクリップボードの使用を混乱させる可能性があることです。もう1つは、単なる古いテキストではなく、TABやF5などの制御コードを送信する場合は役に立たないということです。

于 2012-07-10T20:21:33.600 に答える
11

SendWait()メッセージがターゲットアプリケーションによって処理されるのを待つため、速度は遅くなります。代わりに、Send()関数は待機せず、できるだけ早く戻ります。アプリケーションがどういうわけかビジーである場合、違いはさらに明白になる可能性があります。

電話をかけるFlush()と、アプリケーションを停止して、メッセージキューにキューイングされているキーボードに関連するすべてのイベントを処理します。を使用してそれらを送信した場合はあまり意味がなくSendWait()、ループ内にあるため、アプリケーションの速度が大幅に低下します(Flush()選択的なものとして想像してくださいDoEvents()-はい、すべての欠点があります-SendWait()それ自体も呼び出されます)。

そのパフォーマンスに関心がある場合(ただし、アプリケーションがメッセージを処理できる速度に常に制限されます)、MSDNでこれを読んでください。つまり、ジャーナルフックではなく、関数SendKeysを使用するようにクラスを変更できます。SendInputクイックリファレンスとして、次の設定をapp.configファイルに追加するだけです。

<appSettings>
    <add key="SendKeys" value="SendInput"/>
</appSettings>

とにかく、新しい実装の目標は、速度ではなく、さまざまなバージョンのWindowsとオプション間で一貫した動作をすることです(パフォーマンスの向上は、一種の副作用だと思います)。

于 2012-05-07T10:22:29.793 に答える