回應滑鼠點選

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

訊息 意義
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 位。 MSDN 檔提及 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_XBUTTONDOWNWM_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 。 否則,您的應用程式會中斷標準功能,例如拖曳或最小化視窗。

下一個

滑鼠移動