Windows控制台程序处理消息编程实例二则
一 控制臺程序處理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; }首先要安裝一個事件鉤子,也就是說要建立一個回調函數;ConsoleHandler是回調函數;
然后安裝鉤子,使用SetConsoleCtrlHandler;
控制臺發出了什么消息,有下列值:
CTRL_C_EVENT - 當用戶按下了CTRL+C,或者由GenerateConsoleCtrlEvent API發出.?
CTRL_BREAK_EVENT - 用戶按下CTRL+BREAK, 或者由GenerateConsoleCtrlEvent API發出.
CTRL_CLOSE_EVENT - 當試圖關閉控制臺程序,系統發送關閉消息。
CTRL_LOGOFF_EVENT - 用戶退出時,但是不能決定是哪個用戶.?
CTRL_SHUTDOWN_EVENT - 當系統被關閉時.
參閱
https://www.cnblogs.com/meihao1989/p/3699050.html
注意要在控制臺程序中加入GetMessage、TranslateMessage、DispatchMessage的消息循環才行;
?
按下Ctrl-C提示;
點窗口關閉按鈕提示;
?
二 控制臺處理按鍵消息
#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; }每有鍵按下釋放,都輸出如上內容;
這里有個問題;
SetWindowsHookEx設置鍵盤鉤子;一般第一個參數是WH_KEYBOARD;
但是這里控制臺要用WH_KEYBOARD_LL,不然沒反應;
WH_KEYBOARD_LL在windows.h里沒定義;自己加上#define;
?
根據資料有;
WH_KEYBOARD和WH_KEYBOARD_LL,這兩個都是鍵盤鉤子,
MSDN上面說的是WH_KEYBOARD會在應用程序調用GetMessage 或者 PeekMessage函數并且有鍵盤消息(按下或者釋放)的時候會調用相應的函數進行處理,
WH_KEYBOARD_LL這個類型是只要有鍵盤輸入事件的發生,它都會將鍵盤消息傳給相應函數,
WH_KEYBOARD_LL是底層鍵盤鉤子,來記錄計算機上所有的鍵盤輸入。
總結
以上是生活随笔為你收集整理的Windows控制台程序处理消息编程实例二则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 控制台调用win32 API 示例二则
- 下一篇: java信息管理系统总结_java实现科