首頁>科技>

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結構體。然後將所屬於應用程序的消息存儲到應用程序的消息隊列。應用程序從自己的消息隊列循環的取出,翻譯,派發消息。操作系統接受加工過的消息並調用窗口過程函數。

創建一個窗口

頭條發文機制限制,代碼放不上來。代碼片段如下。

代碼

最簡單的窗口
7
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 逆向學習記錄2:逆向Win32應用程序尋找入口點