windows的消息具有以下兩個參數:
(1)字參數(wParam)
(2)長參數(lParam)
字參數和長參數都是32位整數,用於提供消息的附帶消息,是消息傳遞過程中參數的載體。附加信息的消息號取決於消息號。
一、wParam和lParam消息 :部分說明需要查看MSDN
例如:
WM_SIZE
- wParam
-
Specifies the type of resizing requested. This parameter can be one of the following values.
- SIZE_MAXHIDE
- Message is sent to all pop-up windows when some other window is maximized.
- SIZE_MAXIMIZED
- The window has been maximized.
- SIZE_MAXSHOW
- Message is sent to all pop-up windows when some other window has been restored to its former size.
- SIZE_MINIMIZED
- The window has been minimized.
- SIZE_RESTORED
- The window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies
lParamThe low-order word of lParam specifies the new width of the client area.
The high-order word of lParam specifies the new height of the client area.
1 WM_PAINT消息,LOWORD(lParam)是客戶區的寬,HIWORD(lParam)是客戶區的高。
2 滾動條WM_VSCROLL或WM_HSCROLL消息,LOWORD(wParam)指出了鼠標對滾動條的操作。比如上、下、左、右、翻頁、移動等。
3 擊鍵消息,有WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEYUP、WM_KEYDOWN,其中wParam是虛擬鍵代碼,lParam是包含屬於擊鍵的其他信息。lParam消息參數分為6個域,有重復計數、環境代碼、鍵的先前狀態等。
4 字符消息WM_CHAR、WM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR,lParam消息參數跟擊鍵消息的lParam消息參數內容相同,wParam參數是ANSI或Unicode字符代碼
5 客戶區鼠標消息WM_LBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONUP,lParam參數的低位是鼠標的客戶區x坐標,高位是客戶區y坐標。wParam參數是指示鼠標鍵及Shift和Ctrl鍵的狀態。wParam&MK_SHIFT或MK_CTRL,如果返回TRUE就意味着有按下Shift或Ctrl鍵。
6 非客戶區消息,wParam參數指明移動或者單擊鼠標鍵的非客戶區位置,以HT開頭,lParam參數低位指出了鼠標所在屏幕坐標的x坐標,高位指出了鼠標所在屏幕坐標的y坐標。
7 鼠標輪滾動消息,WM_MOUSEWHEEL消息,lParam將獲得鼠標的屏幕位置(坐標),wParam參數的低位表明鼠標鍵和Shift與Ctrl鍵的狀態。wParam高位有一個“delta”值,該值可正可負,指出了滾輪導致屏幕滾動幾行,120表示向上3行。
8 計時器消息WM_TIMER,wParam參數等於計時器的ID值,lParam為0
9 按鈕子窗口的WM_COMMAND消息,wParam參數的低位是子窗口ID,高位是通知碼, lParam參數是子窗口句柄。
10 焦點消息,對於正在失去焦點的窗口,會收到WM_KILLFOCUS消息,其wParam參數是即將接收輸入焦點的窗口的句柄。對於即將獲取焦點的窗口,會收到WM_SETFOCUS消息,其wParam參數是正在失去焦點的窗口的句柄。
11 編輯控制的WM_COMMAND消息,wParam參數的低位是子窗口ID,高位是通知碼, lParam參數是子窗口句柄。
12 列表框的WM_COMMAND消息,wParam參數的低位是子窗口ID,高位是通知碼, lParam參數是子窗口句柄。
13 菜單消息1,WM_INITMENU,wParam是主菜單句柄,lParam是0.
14 菜單消息2,WM_MENUSELECT,菜單跟蹤消息,指針移到菜單的某一些,就會發送這個消息給窗口過程,其wParam參數的低位是選中項菜單的ID或者彈出式菜單的句柄,高位是選擇標識,lParam參數是包含選中項的菜單句柄。
15 菜單消息3,WM_INITMENUPOPUP,准備顯示一個彈出式菜單時產生的消息,wParam參數是彈出式菜單的句柄,lParam的低位是彈出式菜單的索引,如果該菜單是系統菜單,那么高位是1,否則為0。
16 菜單消息4,WM_COMMAND,選中菜單后產生,wParam低位是擊中菜單的ID,高位是0,lParam參數也是0。
17 菜單消息5,WM_SYSCOMMAND,表示用戶從系統菜單中選擇一個啟用的菜單項,其wParam參數是菜單的ID, lParam為0.如果該消息是由按鼠標產生的,那么lParam參數是鼠標的屏幕坐標。
18 加速鍵消息,WM_COMMAND消息,wParam低位是加速鍵ID,高位是1, lParam是0.
消息 |
說明 |
wParam |
lParam |
WM_PAINT |
低位是客戶區的寬 高位是客戶區的高 |
||
WM_VSCROLL WM_HSCROLL |
窗口滾動條消息 |
低位指出了鼠標對滾動條的操作 |
|
擊鍵消息 |
虛擬鍵代碼 |
分為6個域,有重復計數、環境代碼、鍵的先前狀態等 |
|
字符消息 |
ANSI或Unicode字符代碼 |
分為6個域,有重復計數、環境代碼、鍵的先前狀態等 |
|
客戶區鼠標消息 |
指示鼠標鍵及Shift和Ctrl鍵的狀態 |
鼠標的客戶區坐標 |
|
非客戶區鼠標消息 |
指明移動或者單擊鼠標鍵的非客戶區位置,以HT開頭 |
鼠標的屏幕坐標 |
|
WM_MOUSEWHEEL |
鼠標輪滾動消息 |
低位表明鼠標鍵和Shift與Ctrl鍵的狀態 高位指出了滾輪導致屏幕滾動幾行 |
鼠標的屏幕位置 |
WM_TIMER |
計時器消息 |
計時器的ID值 |
0 |
WM_COMMAND |
按鈕 |
低位是子窗口ID,高位是通知碼 |
子窗口句柄 |
WM_SETFOCUS |
焦點消息 |
正在失去焦點的窗口的句柄 |
|
WM_KILLFOCUS |
焦點消息 |
即將接收輸入焦點的窗口的句柄 |
|
WM_COMMAND |
編輯控制 |
低位是子窗口ID,高位是通知碼 |
子窗口句柄 |
WM_COMMAND |
列表框 |
低位是子窗口ID,高位是通知碼 |
子窗口句柄 |
WM_INITMENU |
主菜單句柄 |
0 |
|
WM_MENUSELECT |
菜單跟蹤消息 |
低位是選中項菜單的ID或者彈出式菜單的句柄,高位是選擇標識 |
選中項的菜單句柄 |
WM_INITMENUPOPUP |
准備顯示一個彈出式菜單時產生 |
彈出式菜單的句柄 |
低位是彈出式菜單的索引,如果該菜單是系統菜單,那么高位是1,否則為0.
|
WM_COMMAND |
選中菜單后產生 |
低位是擊中菜單的ID 高位是0 |
0 |
WM_SYSCOMMAND |
用戶從系統菜單中選擇一個啟用的菜單項 |
菜單的ID |
0如果該消息是由按鼠標產生的,那么是鼠標的屏幕坐標。 |
WM_COMMAND |
加速鍵消息 |
低位是加速鍵ID 高位是1 |
0 |
在Win32中,wParam lParam是用來傳遞消息數據的最常用的手段.
比如,對按鍵消息來說,鼠標的X和Y的坐標被壓縮進lParam中
對MFC來說,消息可以用多樣的類型參數來傳遞,對用戶自定義消息
來說,只能用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傳過來的數據
二、應用獲取控件的ID
LOWORD(GetCurrentMessage()->wParam) ===>獲得發消息的控件ID值
WORD HIWORD( DWORD dwValue );
WORD LOWORD( DWORD dwValue );
知網有篇文章也許有用:C++消息參數wParam與lParam的研究