2011-04-30 33 views
7

我有一個delphi控制檯應用程序,我需要終止時,用戶按下任何鍵,問題是我不知道如何實現一個函數來檢測何時按下一個鍵,我想要做這樣的事情。如何在delphi控制檯應用程序中實現IsKeyPressed函數?

{$APPTYPE CONSOLE} 

begin 
MyTask:=MyTask.Create; 
try 
MyTask.RunIt; 
    while MyTask.Running and not IsKeyPressed do //how i can implement a IsKeyPressed function? 
    MyTask.SendSignal($56100AA); 
finally 
    MyTask.Stop; 
    MyTask.Free; 
end; 

end。

+1

你確定你想要一個繁忙的循環?爲什麼不按ctrl + break打破? – 2011-04-30 22:41:45

回答

9

您可以編寫一個函數來檢測是否按下了鍵,檢查console input buffer

每個控制檯有 包含輸入事件 記錄的隊列的輸入緩衝器。當控制檯的窗口有 鍵盤焦點,控制檯格式 每個輸入事件(如單個 按鍵,鼠標的移動,或 鼠標鍵點擊)作爲輸入 記錄,它在控制檯的地方輸入緩衝區爲 。

首先,你必須調用GetNumberOfConsoleInputEvents函數來獲取事件的數量,然後使用PeekConsoleInput功能檢索事件,並檢查事件是KEY_EVENT最後沖洗使用FlushConsoleInputBuffer控制檯輸入緩衝區。

檢查該樣本

function KeyPressed:Boolean; 
var 
    lpNumberOfEvents  : DWORD; 
    lpBuffer    : TInputRecord; 
    lpNumberOfEventsRead : DWORD; 
    nStdHandle   : THandle; 
begin 
    Result:=false; 
    //get the console handle 
    nStdHandle := GetStdHandle(STD_INPUT_HANDLE); 
    lpNumberOfEvents:=0; 
    //get the number of events 
    GetNumberOfConsoleInputEvents(nStdHandle,lpNumberOfEvents); 
    if lpNumberOfEvents<> 0 then 
    begin 
    //retrieve the event 
    PeekConsoleInput(nStdHandle,lpBuffer,1,lpNumberOfEventsRead); 
    if lpNumberOfEventsRead <> 0 then 
    begin 
     if lpBuffer.EventType = KEY_EVENT then //is a Keyboard event? 
     begin 
     if lpBuffer.Event.KeyEvent.bKeyDown then //the key was pressed? 
      Result:=true 
     else 
      FlushConsoleInputBuffer(nStdHandle); //flush the buffer 
     end 
     else 
     FlushConsoleInputBuffer(nStdHandle);//flush the buffer 
    end; 
    end; 
end; 
相關問題