日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows控制台程序处理消息编程实例二则

發布時間:2025/4/14 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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控制台程序处理消息编程实例二则的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。