2011-08-02 93 views
1

我試過按下X秒按鈕?

keybd_event(keyByte, 0, KEYEVENTF_KEYDOWN, 0); 

Thread.Sleep(3000); 

keybd_event(keyByte, 0, KEYEVENTF_KEYUP, 0); 

但只按一次停了下來,我希望它來模擬按住一個按鈕。例如,如果我在我製作的汽車遊戲中模擬玩家二,並且想要在前進的同時轉動汽車。曲線是90,所以我想保持3秒。我如何做到這一點?

編輯:試圖

   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

您需要計時器,它在3000毫秒後觸發,併發送鍵喚醒事件而不是睡眠。 – Reniuz

+1

在你給的例子中,爲什麼不直接調用轉向代碼呢? 'start_turning;等待; stop_turning' –

+3

您需要添加一個控制模擬播放器的替代方法,而不是依靠鍵盤輸入。你的遊戲引擎不應該關心汽車如何被控制,「控制器」層應該接收鍵盤輸入或自動命令,並將適當的指令傳遞給遊戲引擎。 – Flynn1179

回答

5

應設置3秒鐘的定時器和火災時,應鬆開按鈕。

+0

+1:但請包括爲什麼(使用'Thread.Sleep'將會阻止windows消息循環)。 – leppie

+0

一些示例代碼,看看我的編輯,它的一個循環,但不能正常工作 – Jason94

-3

你有沒有嘗試把

keybd_event(keyByte,0,KEYEVENTF_KEYDOWN,0);

在一個循環中持續3秒?

+0

我試過了: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

您可以在每次更新時調用它,這將模擬每次更新檢查輸入並找到它。如果您想在手動控制和計算機控制之間進行選擇,它也應該引起最小的變化。

但據我所知,沒有選擇說「生成此輸入,直到我說不然」。另外值得一提的是,如果您試圖在賽道上(例如在遊戲中)移動汽車,那麼您可以使用該模擬用戶的控件,而不是僅僅讓計算機按下按鈕。