Windows控制台程序处理消息编程实例二则
一 控制臺(tái)程序處理Windows消息
#include <stdio.h> #include <windows.h>BOOL WINAPI ConsoleHandler(DWORD CEvent) {char mesg[128];switch(CEvent){case CTRL_C_EVENT:MessageBox(NULL,"CTRL+C received!","CEvent",MB_OK);break;case CTRL_BREAK_EVENT:MessageBox(NULL,"CTRL+BREAK received!","CEvent",MB_OK);break;case CTRL_CLOSE_EVENT:MessageBox(NULL,"Program being closed!","CEvent",MB_OK);break;case CTRL_LOGOFF_EVENT:MessageBox(NULL,"User is logging off!","CEvent",MB_OK);break;case CTRL_SHUTDOWN_EVENT:MessageBox(NULL,"User is logging off!","CEvent",MB_OK);break;}return TRUE; }int main(int argc, char* argv[]) {MSG msg;if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE){printf("Unable to install handler!\n");return -1;}while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0; }首先要安裝一個(gè)事件鉤子,也就是說(shuō)要建立一個(gè)回調(diào)函數(shù);ConsoleHandler是回調(diào)函數(shù);
然后安裝鉤子,使用SetConsoleCtrlHandler;
控制臺(tái)發(fā)出了什么消息,有下列值:
CTRL_C_EVENT - 當(dāng)用戶按下了CTRL+C,或者由GenerateConsoleCtrlEvent API發(fā)出.?
CTRL_BREAK_EVENT - 用戶按下CTRL+BREAK, 或者由GenerateConsoleCtrlEvent API發(fā)出.
CTRL_CLOSE_EVENT - 當(dāng)試圖關(guān)閉控制臺(tái)程序,系統(tǒng)發(fā)送關(guān)閉消息。
CTRL_LOGOFF_EVENT - 用戶退出時(shí),但是不能決定是哪個(gè)用戶.?
CTRL_SHUTDOWN_EVENT - 當(dāng)系統(tǒng)被關(guān)閉時(shí).
參閱
https://www.cnblogs.com/meihao1989/p/3699050.html
注意要在控制臺(tái)程序中加入GetMessage、TranslateMessage、DispatchMessage的消息循環(huán)才行;
?
按下Ctrl-C提示;
點(diǎn)窗口關(guān)閉按鈕提示;
?
二 控制臺(tái)處理按鍵消息
#include <windows.h> #include <stdio.h>#define WH_KEYBOARD_LL 13HHOOK g_Hook;LRESULT CALLBACK KeyboardProc(int code,WPARAM w,LPARAM l) {if(w == WM_KEYDOWN)printf("按下按鍵\n");else if(w == WM_KEYUP)printf("釋放按鍵\n");return CallNextHookEx(g_Hook,code,w,l); }int main() {MSG msg;g_Hook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardProc,GetModuleHandle(NULL),0);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}UnhookWindowsHookEx(g_Hook);return 0; }每有鍵按下釋放,都輸出如上內(nèi)容;
這里有個(gè)問(wèn)題;
SetWindowsHookEx設(shè)置鍵盤(pán)鉤子;一般第一個(gè)參數(shù)是WH_KEYBOARD;
但是這里控制臺(tái)要用WH_KEYBOARD_LL,不然沒(méi)反應(yīng);
WH_KEYBOARD_LL在windows.h里沒(méi)定義;自己加上#define;
?
根據(jù)資料有;
WH_KEYBOARD和WH_KEYBOARD_LL,這兩個(gè)都是鍵盤(pán)鉤子,
MSDN上面說(shuō)的是WH_KEYBOARD會(huì)在應(yīng)用程序調(diào)用GetMessage 或者 PeekMessage函數(shù)并且有鍵盤(pán)消息(按下或者釋放)的時(shí)候會(huì)調(diào)用相應(yīng)的函數(shù)進(jìn)行處理,
WH_KEYBOARD_LL這個(gè)類型是只要有鍵盤(pán)輸入事件的發(fā)生,它都會(huì)將鍵盤(pán)消息傳給相應(yīng)函數(shù),
WH_KEYBOARD_LL是底層鍵盤(pán)鉤子,來(lái)記錄計(jì)算機(jī)上所有的鍵盤(pán)輸入。
總結(jié)
以上是生活随笔為你收集整理的Windows控制台程序处理消息编程实例二则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 控制台调用win32 API 示例二则
- 下一篇: 微软Kinect 1.7 附带Color