共用方式為


回應滑鼠點選

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

訊息 意義
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 位大小寫表示低階及低階字組的低階字組。 巨集會擷取正確的值,因此如果您使用它們,您將安全無虞。

滑鼠座標會以像素為單位提供,而不是裝置無關的圖元(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_NCLBUTTONDOWN是非用戶端對等的 WM_LBUTTONDOWN。 一般應用程式不會攔截這些訊息,因為 DefWindowProc 函式會正確處理這些訊息。 不過,它們對於某些進階函式很有用。 例如,您可以使用這些訊息在標題欄中實作自定義行為。 如果您確實處理這些訊息,您通常會在之後將其傳遞至 DefWindowProc 。 否則,您的應用程式會中斷標準功能,例如拖曳或最小化視窗。

下一步

滑鼠移動