零基础逆向工程28_Win32_02_事件_消息_消息处理函数
1 第一個(gè)圖形界面程序
步驟1:創(chuàng)建Windows應(yīng)用程序 選擇空項(xiàng)目步驟2:在新建項(xiàng)窗口中選C++代碼文件 創(chuàng)建一個(gè)新的cpp文件步驟3:在新的cpp文件中添加:#include <Windows.h>并添加入口函數(shù):int CALLBACK WinMain( CALLBACK 是一個(gè)宏_In_ HINSTANCE hInstance, #define CALLBACK __stdcall_In_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine,_In_ int nCmdShow) 所有的Win32 ? ? API函數(shù)都遵循該約定 {return 0; }步驟4:設(shè)計(jì)窗口類代碼://窗口的類名 TCHAR className[] = "My First Window";// 創(chuàng)建窗口類的對(duì)象 WNDCLASS wndclass = {0}; //一定要先將所有值賦值 wndclass.hbrBackground = (HBRUSH)COLOR_MENU; //窗口的背景色 wndclass.lpfnWndProc = WindowProc; //窗口過(guò)程函數(shù) wndclass.lpszClassName = className; //窗口類的名字 wndclass.hInstance = hInstance; //定義窗口類的應(yīng)用程序的實(shí)例句柄步驟5:注冊(cè)窗口類RegisterClass(&wndclass);步驟6:創(chuàng)建窗口// 創(chuàng)建窗口 HWND hwnd = CreateWindow(className, //類名TEXT("我的第一個(gè)窗口"), //窗口標(biāo)題WS_OVERLAPPEDWINDOW, //窗口外觀樣式10, //相對(duì)于父窗口的X坐標(biāo)10, //相對(duì)于父窗口的Y坐標(biāo)600, //窗口的寬度300, //窗口的高度NULL, //父窗口句柄,為NULLNULL, //菜單句柄,為NULLhInstance, //當(dāng)前應(yīng)用程序的句柄NULL); //附加數(shù)據(jù)一般為NULLif(hwnd == NULL) //是否創(chuàng)建成功return 0;步驟7:顯示窗口// 顯示窗口 ShowWindow(hwnd, SW_SHOW);步驟8:消息循環(huán)MSG msg; while(GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg); }步驟9:回調(diào)函數(shù)/* 窗口消息處理程序 窗口回調(diào)函數(shù):1、窗口回調(diào)函數(shù)處理過(guò)的消息,必須傳回0.2、窗口回調(diào)不處理的消息,由DefWindowProc來(lái)處理. */LRESULT CALLBACK WindowProc(IN HWND hwnd,IN UINT uMsg,IN WPARAM wParam,IN LPARAM lParam) {switch(uMsg){//窗口消息case WM_CREATE:{DbgPrintf("WM_CREATE %d %d\n",wParam,lParam);CREATESTRUCT* createst = (CREATESTRUCT*)lParam;DbgPrintf("CREATESTRUCT %s\n",createst->lpszClass);return 0;}case WM_MOVE:{DbgPrintf("WM_MOVE %d %d\n",wParam,lParam);POINTS points = MAKEPOINTS(lParam);DbgPrintf("X Y %d %d\n",points.x,points.y);return 0;}case WM_SIZE:{DbgPrintf("WM_SIZE %d %d\n",wParam,lParam);int newWidth = (int)(short) LOWORD(lParam);int newHeight = (int)(short) HIWORD(lParam);DbgPrintf("WM_SIZE %d %d\n",newWidth,newHeight);return 0;}case WM_DESTROY:{DbgPrintf("WM_DESTROY %d %d\n",wParam,lParam);PostQuitMessage(0);return 0;}//鍵盤消息case WM_KEYUP:{DbgPrintf("WM_KEYUP %d %d\n",wParam,lParam);return 0;}case WM_KEYDOWN:{DbgPrintf("WM_KEYDOWN %d %d\n",wParam,lParam);return 0;}//鼠標(biāo)消息case WM_LBUTTONDOWN:{DbgPrintf("WM_LBUTTONDOWN %d %d\n",wParam,lParam);POINTS points = MAKEPOINTS(lParam);DbgPrintf("WM_LBUTTONDOWN %d %d\n",points.x,points.y);return 0;}}return DefWindowProc(hwnd,uMsg,wParam,lParam); }2 什么是事件?什么是消息?
"動(dòng)作"即是事件,消息是對(duì)事件的具體描述。
Windows為了能夠準(zhǔn)確的描述這些信息,提供了一個(gè)結(jié)構(gòu)體:MSG,該結(jié)構(gòu)體里面記錄的事件的詳細(xì)信息.
typedef struct tagMSG {HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt; } MSG, *PMSG;說(shuō)明:
1、hwnd:窗口句柄
表示消息所屬的窗口
一個(gè)消息一般都是與某個(gè)窗口相關(guān)聯(lián)的
在Windows中 HWND類型的變量通常用來(lái)標(biāo)識(shí)窗口。
2、message:消息類型
在Windows中,消息是由一個(gè)數(shù)值來(lái)表示的
但是由于數(shù)值不便于記憶,所以Windows將消息對(duì)應(yīng)的數(shù)值定義為WM_XXX宏(WM == Window Message)
鼠標(biāo)左鍵按下 WM_LBUTTONDOWN 鍵盤按下 WM_KEYDOWN
3、wParam 和 lParam
32位消息的特定附加信息,具體表示什么處決于message
4、time
消息創(chuàng)建時(shí)的時(shí)間
5、消息創(chuàng)建時(shí)的鼠標(biāo)位置
3 什么是窗口進(jìn)程
LRESULT CALLBACK WindowProc(IN HWND hwnd,IN UINT uMsg,IN WPARAM wParam,IN LPARAM lParam);4 一個(gè)完整的消息流程
轉(zhuǎn)載于:https://www.cnblogs.com/flatcc/p/7683979.html
總結(jié)
以上是生活随笔為你收集整理的零基础逆向工程28_Win32_02_事件_消息_消息处理函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bzoj1055 [HAOI2008]玩
- 下一篇: 博客园的新手一枚