Wparam與Lparam的區別
在Win32 SDK中訊息本身是作為一個結構體記錄傳遞給應用程式的,這個記錄中包含了訊息的型別以及其他資訊。這個記錄型別叫做MSG,它在window中是這樣宣告的:
typedef struct tagMSG { // msg
HWND hwnd; //視窗控制代碼
UINT message; //訊息常量識別符號
WPARAM wParam; //32位訊息的特定附加資訊,具體表示什麼處決於message
LPARAM lParam; //32位訊息的特定附加資訊,具體表示什麼處決於message
DWORD time; //訊息建立時的時間
POINT pt; //訊息建立時的滑鼠位置
} MSG;
hwnd 接收訊息的32位視窗控制代碼。視窗可以是任何型別的螢幕物件,
因為Win32能夠維護大多數可視物件的控制代碼(視窗、對話方塊、按鈕、編輯框等)。
message 用於區別其他訊息的常量值,這些常量可以是Windows單元中預定義的常量,也可以是自定義的常量。
wParam 通常是一個與訊息有關的常量值,也可能是視窗或控制元件的控制代碼。
lParam 通常是一個指向記憶體中資料的指標。
由於wParam,lParam和指標都是32位的,需要時可以強制型別轉換。具體表示什麼,與message相關,他們是事先定義好的。
如果自定義訊息:#define WM_MYMESSAGE WM_USER+100,需確定wParam,lParam的意義
(假設wParam=0時傳送資料,wParam=1時接收資料,lParam為CMyClass* 指標,指向一個CMyClass物件,準備要傳送的資料或接收資料
傳送WM_MYMESSAGE時 SendMessage(hwnd,WM_MYMESSAGE,0,pMyClassObject)
接收訊息的視窗,接收WM_MYMESSAGE中(CMyClass*)lParam引數即pMyClassObject傳過來的資料
我舉個例子吧,也不知確切不確切,大家多包涵阿
首先要說windows是訊息驅動的系統,系統為每一個程式(應該說程序)建立一個訊息佇列。
舉我們選擇選單的例子,當選擇了一個選單項的時候,Windows向選單所屬的視窗傳送WM_COMMAND訊息;而使用者按下了一個加速鍵的時候,windows向TranslateAccelerate函式指定的目標視窗傳送WM_COMMAND訊息。一般這兩者對應的視窗都是主視窗,所以在主視窗中的視窗過程中集中處理WM_COMMAND訊息,而不必考慮它究竟是選單引發的還是加速鍵引發的。
WM_COMMAND訊息的兩個引數是這樣定義的:
wParam的高位 =wNotifyCode ;通知碼
wParam的低位 =wID ;命令ID
lParam = hwdCtl ;傳送WM_COMMAND 訊息的子視窗控制代碼,即誰發的該訊息
除了選單和加速鍵,WM_COMMAND 訊息也可以由其他子視窗引發,如主視窗中的按鈕或工具欄,還有你提到的系統托盤的滑鼠事件等等,lParam引數指定了引發訊息的子視窗控制代碼,對於選單和加速鍵引發的WM_COMMAND訊息,lParam的值為0。wParam引數的低16位是命令ID,也就是資源指令碼檔案中選單項的命令ID或加速鍵的命令ID,高16位是通知碼,選單訊息的通知碼是0,加速鍵訊息的通知碼為1。
這只是選單和加速鍵的定義。其他的訊息可能與此不同,具體查資料吧。