win32編程的重中之重是理解windows的消息機制,也是逆向學習的必經之路。文章只是自己學習筆記,如有不足,望指正與海涵(大家輕點噴)。
windows消息結構
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt;} MSG, *PMSG, *NPMSG, *LPMSG;
這個結構體就是windows用來描述消息的。
1. HWND hwnd;//表示消息所屬的窗口
A handle to the window whose window procedure receives the message. This member is NULL when the message is a thread message.
HWND是windwos自定義類型。通常用來表示窗口。使用IDE提供的類型聲明可以在<windef.h>中看到一個宏函數DECLARE_HANDLE(HWND);繼續追蹤可以在<winnt.h>看到:
#ifdef STRICTtypedef void *HANDLE;#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n#elsetypedef PVOID HANDLE;#define DECLARE_HANDLE(n) typedef HANDLE n#endif
通過宏定義可以看出HWND的本質就是void*類型。
2.UINT message;//消息常量標識符
The message identifier. Applications can only use the low word; the high word is reserved by the system.
第二個成員表示消息的類型,從官方文檔表述中可以得知應用程序僅能使用低位的兩個字節。
3.WPARAM wParam; 4.LPARAM lParam;
Additional information about the message. The exact meaning depends on the value of the message member.
第三和第四個成員是對第二層消息類型的詳細描述。
5.DWORD time;
The time at which the message was posted.
動作或消息觸發的時間。
6.POINT pt;
typedef struct tagPOINT { LONG x; LONG y;} POINT, *PPOINT;
The cursor position, in screen coordinates, when the message was posted.
消息被觸發時鼠標的位置。及鼠標在屏幕上的位置,以1024x768屏幕為例,屏幕左上角既是座標系的起點(0,0);向右是x軸,向下是y軸。
消息處理流程
系統消息隊列和應用程序消息隊列
從流程圖中我們可以清晰地看出消息的處理過程。當用戶或系統觸發某個動作時,系統將動作封裝成一個消息及MSG結構體。然後將所屬於應用程序的消息存儲到應用程序的消息隊列。應用程序從自己的消息隊列循環的取出,翻譯,派發消息。操作系統接受加工過的消息並調用窗口過程函數。
創建一個窗口
頭條發文機制限制,代碼放不上來。代碼片段如下。
代碼
最簡單的窗口