共用方式為


回應滑鼠點選

如果使用者在游標位於視窗的工作區上方時按下滑鼠按鈕,則視窗會收到下列其中一則訊息。

訊息 意義
WM_LBUTTONDOWN 左按鈕向下
WM_LBUTTONUP 左按鈕向上
WM_MBUTTONDOWN 中間按鈕按下
WM_MBUTTONUP 中間按鈕向上
WM_RBUTTONDOWN 右鍵按下
WM_RBUTTONUP 右鍵向上
WM_XBUTTONDOWN XBUTTON1或XBUTTON2關閉
WM_XBUTTONUP XBUTTON1或XBUTTON2釋放

 

請記住,客戶端區域是視窗中排除邊框的部分。 如需用戶端應用程式的詳細資訊,請參閱 什麼是視窗?

滑鼠座標

在所有這些訊息中 ,lParam 參數包含滑鼠指標的 x 和 Y 座標。 lParam 的最低 16 位包含 x 座標,而下一個 16 位則包含 y 座標。 使用GET_X_LPARAMGET_Y_LPARAM巨集,從lParam提取座標。

int xPos = GET_X_LPARAM(lParam); 
int yPos = GET_Y_LPARAM(lParam);

這些巨集定義於標頭檔案 WindowsX.h 中。

在 64 位 Windows 上, lParam 是 64 位值。 lParam 的上層 32 位未使用。 其中 Windows 文件提到 lParam 的「低序字」和「高階字」時,64 位元的情況是指低 32 位的低序字和高序字。 使用巨集可以正確擷取值, 因此如果您採用它們, 就會有保障。

滑鼠座標是以像素(非裝置無關的圖元,DIP)為單位提供,並且是相對於視窗的客戶區來測量。 座標是帶正負號的值。 在用戶區域上方和左側的座標為負數,這在您追蹤視窗外的滑鼠位置時非常重要。 我們將在稍後的主題中 瞭解如何在視窗外擷取滑鼠移動。

其他旗標

wParam 參數包含一個位 OR 的旗標,表示其他滑鼠按鈕的狀態加上 SHIFT 和 CTRL 鍵。

旗標 意義
MK_CONTROL CTRL 鍵已關閉。
MK_LBUTTON 滑鼠左鍵已關閉。
MK_MBUTTON 滑鼠中間按鈕已關閉。
MK_RBUTTON 滑鼠右鍵已關閉。
MK_SHIFT SHIFT 鍵已關閉。
MK_XBUTTON1 [XBUTTON1] 按鈕已關閉。
MK_XBUTTON2 [XBUTTON2] 按鈕已關閉。

 

沒有旗標表示未按下對應的按鈕或按鍵。 例如,若要測試 CTRL 鍵是否關閉:

if (wParam & MK_CONTROL) { ...

如果您需要尋找 CTRL 和 SHIFT 以外的其他按鍵狀態,請使用鍵盤輸入中所述的 GetKeyState 函式。

WM_XBUTTONDOWN和WM_XBUTTONUP視窗訊息同時套用至XBUTTON1和XBUTTON2。 wParam 參數會指出已按下哪個按鈕。

UINT button = GET_XBUTTON_WPARAM(wParam);  
if (button == XBUTTON1)
{
    // XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
    // XBUTTON2 was clicked.
}

滑鼠按兩下

根據預設,視窗不會收到按兩下通知。 若要接收雙擊,請在註冊窗口類別時,在 WNDCLASS 結構中設定 CS_DBLCLKS 旗標。

    WNDCLASS wc = { };
    wc.style = CS_DBLCLKS;

    /* Set other structure members. */

    RegisterClass(&wc);

如果您如所示設定 CS_DBLCLKS 旗標,視窗將會收到按兩下通知。 雙擊由名稱包含「DBLCLK」的視窗訊息表示。 例如,按兩下滑鼠左鍵會產生下列訊息序列:

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

實際上,通常會產生的第二個WM_LBUTTONDOWN訊息會變成WM_LBUTTONDBLCLK訊息。 對等訊息是針對右、中間和 XBUTTON 按鈕所定義。

在您收到雙擊訊息之前,無法判斷第一次滑鼠按下是否為雙擊的開頭。 因此,雙擊動作應該延續第一個滑鼠按一下所開啟的動作。 例如,在 Windows Shell 中,按兩下即可選取資料夾,而按兩下會開啟資料夾。

非用戶端滑鼠訊息

對於在視窗的非客戶區域中發生的滑鼠事件,定義了一套單獨的訊息。 這些訊息的名稱中有字母 「NC」。 例如,WM_NCLBUTTONDOWNWM_LBUTTONDOWN 的非客戶端等價物。 一般應用程式不會攔截這些訊息,因為 DefWindowProc 函式會正確處理這些訊息。 不過,它們對於某些進階函式很有用。 例如,您可以使用這些訊息在標題欄中實作自定義行為。 如果您確實處理這些訊息,您通常會在之後將其傳遞至 DefWindowProc 。 否則,您的應用程式會中斷標準功能,例如拖曳或最小化視窗。

下一步

滑鼠移動