0

特定の (非定期的な) 時間間隔の後にアクティブなウィンドウに異なるキーを送信する Windows フォーム アプリを作成しようとしています。

たとえば、ボタンを押した後、プログラムは 3 秒間待機してから、アクティブなウィンドウに "H" を送信します。さらに 1 秒後に「E」を送信し、さらに 1 秒後に「Y」を送信します。

しかし、私がこれを試すと:

Thread.Sleep(3000);
SendKeys.Send("H");
Thread.Sleep(1000);
SendKeys.Send("E");
Thread.Sleep(1000);
SendKeys.Send("Y");

プログラムは (少なくとも) 3 秒間待機しますが、次の 2 つのキーが送信される間は一時停止していないようです。

Sleep は少なくとも指定された引数の遅延のみを保証するため、Timer を使用して同様のものを実装しようとしてきました。より正確なものが必要です。ただし、私が見つけることができた唯一の例は、定期的な時間間隔の後にコードが実行されていました。

スリープを使用して試したことを達成するためにタイマーを使用する方法、または一般的により良い方法はありますか?

4

2 に答える 2

1

Send の代わりに SendWait を使用します。

Thread.Sleep(3000);
SendKeys.SendWait("H");
Thread.Sleep(1000);
SendKeys.SendWait("E");
Thread.Sleep(1000);
SendKeys.SendWait("Y");
于 2012-04-19T03:46:45.207 に答える
0

ボタン イベント ハンドラーと Thread.Sleep 呼び出しが同じスレッドで発生しています。OnClick ハンドラーが終了するまで、フォームは受け取ったキーの処理を開始できません。

Click ハンドラーで:

Thread t = new Thread(new ThreadStart(sendTheKeys));
t.start();

そして、キーを送信する方法、

private void sendTheKeys()
{
    Thread.Sleep(3000);
    this.Invoke(new MethodInvoker(()=> {SendKeys.Send('H');}));
    Thread.Sleep(1000);

    this.Invoke(new MethodInvoker(()=>{SendKeys.Send("E");}));

    Thread.Sleep(1000);
    this.Invoke(new MethodInvoker(() => {SendKeys.Send("Y");}));
}

そのような何かがあなたを始めるべきです。私はこれを頭の上でやったので、スレッド開始コードの核心を忘れたかもしれません

于 2012-04-19T03:43:42.503 に答える