2012-04-19 20 views
0

特定の(非規則的な)時間間隔の後に異なるキーをアクティブなウィンドウに送信するWindowsフォームアプリケーションを作成しようとしています。特定の時間間隔の後にコードを実行すると、C#.NET

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

しかし、私はこれ試してみてください(少なくとも)プログラムウェイト3秒

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

を、しかし送られた次の二つのキーの間に一時停止していないようです。

スリープでは少なくとも引数の長さだけ遅延が保証されているので、私はタイマーを使って同様のものを実装しようとしてきました。しかし、私が見つけることができた唯一の例は、一定の時間間隔の後にコードを実行していました。

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

+1

次回のインターバルを反映させるたびにタイマーを再定義できると思いますか? – TGH

答えて

1

Sendの代わりにSendWaitを使用してください。

Thread.Sleep(3000); 
SendKeys.SendWait("H"); 
Thread.Sleep(1000); 
SendKeys.SendWait("E"); 
Thread.Sleep(1000); 
SendKeys.SendWait("Y"); 
+0

それはやっているようです。本当にありがとう。 – jbaby

0

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

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");})); 
} 

何かがあなたが始める必要があります。私はこれを頭の上から外して、スレッドスタートコードの要点を忘れているかもしれません。

+0

彼は自分のフォームではないアクティブなアプリケーションにキーを送信しています。 – SimpleVar

関連する問題