2011-08-02 11 views
1

私はボタンをX秒間押しますか?

keybd_event(keyByte, 0, KEYEVENTF_KEYDOWN, 0); 

Thread.Sleep(3000); 

keybd_event(keyByte, 0, KEYEVENTF_KEYUP, 0); 

を試みた。しかし、それは一度だけと一時停止し、それを押すと、私はそれがボタンを押しシミュレートします。私が作った車の試合でプレーヤー2をシミュレートしているなら、それは前進しながら車を回したいと思う例です。カーブは90なので、それを3秒間保持したい。どのように私はこれを行うには?

EDITは:

   DateTime start = DateTime.Now; 
       TimeSpan timespan = DateTime.Now.Subtract(DateTime.Now); 

       if (timespan.TotalMilliseconds < duration) 
       { 
        timespan = DateTime.Now.Subtract(start); 

        keybd_event(keyByte, 0, KEYEVENTF_KEYDOWN, 0); 
       } 

       keybd_event(keyByte, 0, KEYEVENTF_KEYUP, 0); 

を試みたが、結果

+0

あなたは3000ms後に起動し、スリープの代わりにキーアップイベントを送信するタイマーが必要です。 – Reniuz

+1

あなたが与えた例では、回転コードを直接呼び出すだけではいかがですか? 'start_turning;待つ; stop_turning' –

+3

キーボード入力に頼るよりもシミュレートされたプレーヤーを制御する別の方法を追加する必要があります。あなたのゲームエンジンは車がどのように制御されているか気にしてはいけません。「コントローラ」レイヤーはキーボード入力や自動化されたコマンドを受け取り、適切な命令をゲームエンジンに渡します。 – Flynn1179

答えて

5

ずにあなたは3秒間タイマーを設定する必要があり、それが発射したときに、ボタンを離す必要があります。あなたは

keybd_event(keyByte、0、KEYEVENTF_KEYDOWN、0)を入れて

+0

+1:しかし、理由(なぜなら、 'Thread.Sleep'を使用すると、ウィンドウのメッセージループをブロックする)の理由を含めてください。 – leppie

+0

いくつかのサンプルコードもありますが、私の編集を見て、そのループは正常に動作しません。 – Jason94

-3

てみました。

3秒間ループしますか?

+0

Iveが試みました:const int KEYEVENTF_KEYUP = 0x2; const int KEYEVENTF_KEYDOWN = 0x0; DateTime start = DateTime.Now; TimeSpan timespan = DateTime.Now.Subtract(DateTime.Now); if(timespan.TotalMilliseconds Jason94

+0

@ Jason94そのコードはすべてのループでKEYUPを処理しますが、その中にelseがあると、持続時間を超えたときにのみ起動します。 – StephenT

0

これはすべての更新プログラムを呼び出すことができます。これは、各更新プログラムの入力を確認して見つけ出すことをシミュレートします。また、手動制御とコンピュータ制御の間でオプションを提供する場合は、最小限の変更が必要です。

しかし、私が知っている限り、「そうでないと言うまで、この入力を生成する」というオプションはありません。

また、トラック上の車を移動しようとしている場合(ゲーム内など)には数学がありますが、一般にはコンピュータがボタンを押すのではなく、ユーザーのコントロールをシミュレートします。

関連する問題