控制台程式的事件處理

2021-05-22 23:00:25 字數 2701 閱讀 7331

控制台程式在

windows

程式的角色中是非常強大且方便的,像vc,

c#,delphi

等等,好多功能強大的語言都支援控制台程式。她沒有複雜的

gui,完全是

32位的程式,能夠呼叫除

gdi

函式之外的

api,支援多執行緒,支援

mfc等等。用她來除錯程式、學習程式設計、做實驗等是再合適不過的了。我經常把我試驗性的程式用控制台方式來寫,非常方便。

console

程式不像

win32 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(

dword 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)

generateconsolectrlevent(ctrl_c_event, 0);

// 手工產生乙個事件

scanf("%s", buf);

// 模擬等待事件發生,如果不要這句執行

// 程式的時候,程式一閃即過,來不急觀

// 察程式。

return 0; }

bool winapi consolehandler(dword cevent)

return true; }

這段程式非常簡單,但原理非常重要有用,但願你們每個人都能看懂我在說什麼,好了,不說了,最近工作非常忙,有時間的時候我想跟大家討論一下吧,希望對大家有所幫助。

C 處理控制台關閉事件

我們開發的控制台應用,在執行階段很有可能被使用者ctrl c終止或是被使用者直接關閉。如果我們不希望使用者通過ctrl c終止我們的程式,就需要對ctrl c或關閉事件作處理。在.net平台下console類有個cancelkeypress事件可以處理ctrl c,不過對於直接關閉控制台應用,這種處...

控制台程式裡呼叫控制台程式

現在遇到這麼個問題,我想用控制台裡呼叫控制台程式來實現多文字。但是在控制台裡呼叫控制台程式時,它不是出現新的控制台視窗顯示,而是已有的控制台裡顯示呼叫的程式,system d code 練習 jjplace editor debug editor.exe winexec d code 練習 jjpl...

沒有控制台視窗的控制台程式

include include pragma comment linker,subsystem windows entry maincrtstartup int main int argc,char argv 編譯後執行程式會彈出乙個訊息框,而沒有背後的控制台視窗。再看看下面的 include in...