Windows如何區分鼠標雙擊和兩次單擊
http://lbsloveldm.blog.hexun.com/12212875_d.html
在Windows平台上,鼠標左鍵的按下、松開、快速的兩次點擊會產生WM_LBUTTONDOWN、WM_LBUTTONUP和WM_LBUTTONDBLCLK消息,但是Windows根據什么來區分連續的兩次鼠標按鍵操作,是兩次獨立的單擊,還是一次雙擊呢?最近在解決一個問題時,通過使用Spy++和查閱MSDN,弄清楚了這個問題。簡單總結如下:
Windows根據兩個條件來做這個區分:
(1)雙擊的時間間隔
這是很容易想到的。更准確的說法是這樣的,
兩次單擊會產生四個鼠標點擊消息,如果第三個消息(第二次按下)和第二個消息(第一次彈起引發的WM_LBUTTONUP)間隔短於指定值,則把第三個消息處理成WM_LBUTTONDBLCLK消息;第四個消息照舊,WM_LBUTTONUP。
這個指定的時間間隔,在Windows XP SP2上缺省是0.5秒,其他操作系統可能相同。通過::GetDoubleClickTime調用可以得到這個值。
這個值是可以設置的。有兩種方法設置這個值: ::SetDoubleClickTime調用,或者以SPI_SETDOUBLECLICKTIME為第一個參數調用::SystemParametersInfo。設置的結果對系統中其他的應用程序也起作用。
(2)兩次鼠標擊點的空間距離
在第一次點擊時,Windows以擊點為中心,檢測一個矩形區域,如果第二次點擊不落在這個區域內,那就不把第三個消息算作WM_LBUTTONDBLCLK消息。
這個矩形區域的缺省大小,在Windows XP SP2上缺省是4pt×4pt。可以以SM_CXDOUBLECLK或SM_CYDOUBLECLK為參數調用::GetSystemMetrics得到。
這個值也是可以設置的。設置的方法是通過SPI_SETDOUBLECLKWIDTH或SPI_SETDOUBLECLKHEIGHT為第一個參數來調用::SystemParametersInfo。設置的結果對系統中其他的應用程序也起作用。
因此,連續兩次按下和彈起鼠標左鍵:
如果不符合以上兩個條件,產生的消息是:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDOWN
WM_LBUTTONUP
如果符合以上兩個條件,產生的消息則是:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
以上結論還隱含兩個要點:
(1)不管是算作兩次連續的單擊,還是一次雙擊,第一、二和四個消息都是不受影響的。在接受到一個雙擊消息之前,應用程序總是會先收到一個WM_LBUTTONDOWN和一個WM_LBUTTONUP消息,之后是WM_LBUTTONUP消息。應用程序應該對各種消息做出恰當的處理;
(2)第二個消息和第三個消息是關鍵,必須被連續發到同一個窗口過程才能被處理。開發中常見的一個錯誤是這樣的:在處理第一個消息WM_LBUTTONDOWN或者WM_LBUTTONUP時,通過SetCapture捕獲后續的鼠標消息,轉發到別的窗口,導致原窗口不能識別雙擊,而這個雙擊可能正是期望的。
轉自: http://blog.163.com/guochunhui3024@126/blog/static/25589885201152182524176/