當(dāng)前位置:
首頁 >
Windos消息驱动
發(fā)布時間:2025/7/14
29
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Windos消息驱动
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
當(dāng)Window是向程序發(fā)送消息時,它調(diào)用程序中的一個函數(shù),這個函數(shù)用來描述Windows發(fā)送的消息,成為窗口函數(shù)或消息處理函數(shù)。他是一個自定義的回調(diào)函數(shù):
LRESULT CALLBACK WindowProc(HWND hwnd, UNIT uMsg, WPARAM wParam, LPARAM lParam);?
- CALLBACK 宏是_stdcall的意思,說明采用WIndows標準方式傳遞參數(shù)。 詳見:https://blog.csdn.net/lionghua/article/details/38415655
- uMsg:是一個消息ID號,它指定了所發(fā)的消息,當(dāng)窗口函數(shù)接受到消息時,它使用消息ID號來決定如何處理這個消息;后面兩個參數(shù)wParam和lParam的值也取決于uMsg。
?
例:關(guān)閉一個記事本程序,即向它的主窗口發(fā)送WM_CLOSE消息:
int main(int argc,char* argv[]) {//查找標題為“無標題-記事本“的窗口HWND hWnd = ::FindWindow(NULL,"無標題-記事本");//也可以使用類名查找,如 FindWindow("Notepad",NULL);if(hWnd != NULL)::SendMessage(hWnd,WM_CLOSE,0,0);return 0; }- FindWindow函數(shù):查找窗口類名稱和窗口標題與指定字符串相匹配的窗口。
- SendMessage函數(shù): 向窗口發(fā)送消息,直到目標窗口處理完這個消息才返回。參數(shù)與WindowProc函數(shù)相同。
?
以下是Windows程序的基本框架,win32程序都是在這個框架的基礎(chǔ)上擴充而來:
1 #include <windows.h> 2 3 LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM); 4 int APIENTRY WinMain(HINSTANCE hInstance, 5 HINSTANCE hPrevInstance, 6 LPSTR lpCmdLine, 7 int nCmdShow) 8 { 9 char szClassName[] = "MainWClass"; 10 WNDCLASSEX wndclass; 11 //用描述主窗口的參數(shù)來填充WNDCLASSEX結(jié)構(gòu) 12 wndclass.cbSize=sizeof(wndclass); //結(jié)構(gòu)大小 13 wndclass.style=CS_HREDRAW | CS_VREDRAW; //指定如果大小改變就重畫 14 wndclass.lpfnWndProc=MainWndProc; //窗口指針函數(shù) 15 wndclass.cbClsExtra=0; //沒有額外的類內(nèi)存 16 wndclass.cbWndExtra=0; //沒有額外窗口內(nèi)存 17 wndclass.hInstance = hInstance; //實例句柄 18 wndclass.hIcon=::LoadIcon(NULL, IDI_APPLICATION); //使用預(yù)定義圖標 19 wndclass.hCursor=::LoadCursor(NULL, IDC_ARROW); //使用預(yù)定義光標 20 wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH); //使用白色背景畫刷 21 wndclass.lpszMenuName=NULL; //不指定菜單 22 wndclass.lpszClassName=szClassName; //窗口類名稱 23 wndclass.hIconSm=NULL; //沒有類的小圖標 24 25 //注冊這個窗口類 26 ::RegisterClassEx(&wndclass); 27 //創(chuàng)建主窗口 28 HWND hWnd=::CreateWindowEx( 29 0, //dwExStyle,擴展樣式 30 szClassName, //lpClassName,類名 31 "My First Window!", //lpWindowName,窗口標題 32 WS_OVERLAPPEDWINDOW, //swStyle,窗口風(fēng)格 33 CW_USEDEFAULT, //X,初始x坐標 34 CW_USEDEFAULT, //Y,初始y坐標 35 CW_USEDEFAULT, //nWidth,寬度 36 CW_USEDEFAULT, //nHeight,高度 37 NULL, //hWndParent,父窗口句柄 38 NULL, //hMenu,菜單句柄 39 hInstance, //hInstance,程序?qū)嵗浔?/span> 40 NULL); //lpParam,用戶數(shù)據(jù) 41 42 if(hWnd == NULL) 43 { 44 ::MessageBox(NULL,"創(chuàng)建窗口出錯!","error",MB_OK); 45 return -1; 46 } 47 //顯示窗口,刷新窗口客戶區(qū) 48 ::ShowWindow(hWnd,nCmdShow); 49 ::UpdateWindow(hWnd); 50 //從消息隊列中取出消息,交給窗口函數(shù)處理,直到GetMessage返回FALSE,結(jié)束消息循環(huán) 51 MSG msg; 52 while(::GetMessage(&msg,NULL,0,0)) 53 { 54 //轉(zhuǎn)化鍵盤消息 55 ::TranslateMessage(&msg); 56 //將消息發(fā)送到相應(yīng)的窗口函數(shù) 57 ::DispatchMessage(&msg); 58 } 59 return msg.wParam; 60 } 61 62 LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 63 { 64 char szText[]="Hello World!"; 65 switch(message) 66 { 67 case WM_PAINT: //窗口客戶區(qū)重繪 68 { 69 HDC hdc; 70 PAINTSTRUCT ps; 71 //使無效的客戶區(qū)變得有效,并取得設(shè)備環(huán)境句柄 72 hdc=::BeginPaint(hWnd,&ps); 73 //顯示文字 74 ::TextOut(hdc,10,10,szText,strlen(szText)); 75 ::EndPaint(hWnd,&ps); 76 return 0; 77 } 78 case WM_DESTROY: //銷毀窗口 79 ::PostQuitMessage(0); 80 return 0; 81 } 82 //將不處理的消息交給系統(tǒng)默認處理 83 return ::DefWindowProc(hWnd,message,wParam,lParam); 84 } 簡單Win窗口?
轉(zhuǎn)載于:https://www.cnblogs.com/ShadowCharle/p/10696810.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Windos消息驱动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql和Hadoop+Hive有什么
- 下一篇: 关于错误 openssl/ssl.h:没