當滑鼠移過視窗的顯示區域時,視窗消息處理程式收到WM_MOUSEMOVE消息。當在視窗的顯示區域中按下或者釋放一個滑鼠按鍵時,視窗消息處理程式會接收到下面這些消息:
鍵
按下
釋放
按下(雙鍵)
左
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
中
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK
右
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCLK
要接受到雙鍵消息,需要在wndclass.style處增加CS_DBLCLKS
在WM_MOUSEMOVE中,可以用LOWORD和HIWORD宏來提取滑鼠的位置:
wParam中包含資訊。MK字首代表「滑鼠按鍵」。
MK_LBUTTON
按下左鍵
MK_MBUTTON
按下中鍵
MK_RBUTTON
按下右鍵
MK_SHIFT
按下Shift鍵
MK_CONTROL
按下Ctrl鍵
當您把滑鼠移過視窗的顯示區域時,Windows并不為滑鼠的每個可能的圖素位置都産生一個WM_MOUSEMOVE消息。您的程式接收到WM_MOUSEMOVE消息的次數,依賴于滑鼠硬體,以及您的視窗消息處理程式在處理滑鼠移動消息時的速度。
視窗消息處理程式可以「攔截滑鼠」并且連續地接收滑鼠消息,即使此時滑鼠在該視窗顯示區域之外。您将在本章的後面學習如何攔截滑鼠。
如果正在顯示一個系統模态消息框或者系統模态對話框,那麼其它程式就不能接收滑鼠消息。當系統模态消息框或者對話框活動時,禁止切換到其它視窗或者程式。一個顯示系統模态消息框的例子,是當您關閉Windows時。
執行個體
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5iN1gDOhRGN4QTYxMGMjRGO3YmZhBTMiVjMkFTYiZTMi9CX0EzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.gif)
組合鍵測試
客戶區滑鼠消息簡單應用
按下(輕按兩下)
WM_NCLBUTTONDOWN
WM_NCLBUTTONUP
WM_NCLBUTTONDBLCLK
WM_NCMBUTTONDOWN
WM_NCMBUTTONUP
WM_NCMBUTTONDBLCLK
WM_NCRBUTTONDOWN
WM_NCRBUTTONUP
WM_NCRBUTTONDBLCLK
可以用兩個Windows函數将螢幕坐标轉換為顯示區域坐标或者反之:
WM_NCHITTEST,它代表「非顯示區域命中測試」。此消息優先于所有其它的顯示區域和非顯示區域滑鼠消息。lParam參數含有滑鼠位置的x和y螢幕坐标,wParam 參數另有用途。
Windows應用程式通常把這個消息傳送給DefWindowProc,然後Windows用WM_NCHITTEST消息産生與滑鼠位置相關的所有其它滑鼠消息。對于非顯示區域滑鼠消息,在處理WM_NCHITTEST時,從DefWindowProc傳回的值将成為滑鼠消息中的wParam參數,這個值可以是任意非顯示區域滑鼠消息的wParam值再加上以下内容:
HTCLIENT
HTNOWHERE
HTTRANSPARENT
HTERROR
顯示區域
不在視窗中
視窗由另一個視窗覆寫
使DefWindowProc産生警示用的哔聲
如果DefWindowProc在其處理WM_NCHITTEST消息後傳回HTCLIENT,那麼Windows将把螢幕坐标轉換為顯示區域坐标并産生顯示區域滑鼠消息。