控制檯程式的事件處理 (轉)
控制檯的事件處理: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- javaScript事件(二)事件處理程式JavaScript事件
- 事件冒泡、事件捕獲、DOM0級事件處理程式、DOM2級事件處理程式事件
- 啟動一個程式並處理程式結束事件 (轉)事件
- [轉] Scala 中的非同步事件處理非同步事件
- 在Delphi中捕獲控制檯程式的輸出 (轉)
- c# winform之多個控制元件統一事件處理程式C#ORM控制元件事件
- 有趣的控制檯玩法:一行程式碼繪製控制檯影像!行程
- 不一樣的控制檯程式—–在控制檯中輸出圖片薦
- 事件處理事件
- Win32控制檯程式的定時器實現(轉載)Win32定時器
- C#視窗事件處理初探 (轉)C#事件
- C# 控制檯禁用快速編輯模式、在指定行更新文字、註冊Ctrl+C事件處理器C#模式事件
- java中的事件處理Java事件
- 小程式的事件處理引數不能取得事件
- Flutter | 事件處理Flutter事件
- JavaScript事件處理JavaScript事件
- React事件處理React事件
- vue事件處理Vue事件
- IE事件處理事件
- 事件相容處理事件
- JS事件處理JS事件
- BREW常見問題解答(FAQ 5)-處理器和事件處理 (轉)事件
- 隱藏控制檯應用程式的視窗
- 手把手教你如何寫事件處理的程式碼事件
- Javascript事件處理程式的5種方式(相容寫法)JavaScript事件
- java-執行 java 控制檯程式Java
- 控制檯程式實現Timer
- freeswitch的event事件處理事件
- redis的事件處理機制Redis事件
- Delphi處理TWebBrowser的Close事件Web事件
- Java-GUI程式設計之事件處理JavaGUI程式設計事件
- win10打不開xbox控制檯怎麼處理_win10系統中xbox控制檯打不開解決教程Win10
- react之事件處理React事件
- wx處理滑鼠事件事件
- JAVA控制檯下:控制檯商城購物系統Java
- 事件分發之View事件處理事件View
- MFC動態建立控制元件的訊息處理 (轉)控制元件
- Henry的VB.NET之旅(十三)—標準事件處理程式事件