控制檯程式的事件處理 (轉)

amyz發表於2007-11-16
控制檯程式的事件處理 (轉)[@more@]

控制檯的事件處理:namespace prefix = o ns = "urn:schemas--com::office" />

作者:彭偉(西方不敢很帥)  E:pwei@gr.com.cn

轉載請徵得作者同意

-7-10

 

控制檯程式在程式的角色中是非常強大且方便的,像VC,,等等,好多功能強大的語言都支援控制檯程式。她沒有複雜的GUI,完全是32位的程式,能夠呼叫除GDI 函式之外的,支援多執行緒,支援MFC等等。用她來除錯程式、學習程式設計、做實驗等是再合適不過的了。我經常把我試驗性的程式用控制檯方式來寫,非常方便。

 

Console程式不像 GUI程式那樣具有訊息佇列,所以當程式中斷的時候也無從得知。假如我們程式正在處理一個長時間的作業,當使用者要退出系統,或按了Ctrl + C(Ctrl + Break),或系統將要關閉的時候,我們的資料就可能會因此而丟失。難道沒有辦法了麼?哦,不,有辦法的。看下面,下面我將跟大家談談關於Console程式的事件處理。

 

要讓控制檯程式具有事件處理能力需要用到下面幾個API函式,他們的原型宣告如下:

 

BOOL SetConsoleCtrlHandler(


  PHANDLER_ROUTINE HandlerRoutine,  // handler function


  BOOL Add     // add or remove handler


);

 

HandlerRoutine指向一個事件處理函式,是的,可能你已經猜到了,這個函式相當於Win32 GUI程式中的視窗處理函式。這個函式的原型如下:

 

BOOL WINAPI HandlerRoutine(


  D dwCtrlType    //  control signal type


);

 

這個函式的dwCtrlType指示出接收到的控制訊號,這個引數可能是下面值中的某一個:

 

CTRL_C_EVENT

一個Ctrl + C的訊號被接收,該訊號或來自鍵盤,或來自GenerateConsoleCtrlEvent 函式

CTRL_BREAK_EVENT

一個 Ctrl + Break 訊號被接收,該訊號或來自鍵盤,或來自GenerateConsoleCtrlEvent 函式

CTRL_CLOSE_EVENT

當使用者系統關閉Console時,系統會傳送此訊號到此

CTRL_LOGOFF_EVENT

當使用者退出系統時系統會傳送這個訊號給所有的Console程式。該訊號不能顯示是哪個使用者退出。

CTRL_SHUTDOWN_EVENT

當系統將要關閉時會傳送此訊號到所有Console程式。

 

在程式中,HandlerRoutine接收到上面那些事件的時候就可以進行相應的處理或忽略該事件。如果選擇忽略該事件,則HandlerRoutine必須返回FALSE,否則返回TRUE。

 

我們用SetConsoleCtrlHandler安裝HandlerRoutine時,Add引數應設為TRUE,想要刪除已經安裝的HandlerRoutine,請再用這個函式,只需把Add設為FALSE即可。

 

另外,得用GenerateConsoleCtrlEvent函式可以産生CTRL_C_EVENT和CTRL_BREAK_EVENT事件,利用這個函式我們就可以在我們程式中更加巧妙靈活的控制程式了。這個API使用方法非常簡單,我在這裡就不說了,可以參加MSDN或API手冊。

 

下面我們就來寫一個非常簡單的程式:

 

int _tmain(int argc, _TCHAR* argv[])

{

  char  buf[256];

 

  if (SetConsoleCtrlHandler(      // 安裝事件處理

    (PHANDLER_ROUTINE)ConsoleHandler, TRUE) == FALSE)

  {

  // 安裝失敗

    printf("Unable to install event handler!n");

  return -1;

  }

 

  GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);  // 手工産生一個事件

  scanf("%s", buf);      // 模擬等待事件發生,如果不要這句噝

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982761/,如需轉載,請註明出處,否則將追究法律責任。

相關文章