Windows將鼠標(biāo)單擊轉(zhuǎn)換為雙擊的原理(鼠標(biāo)變成雙擊)
對于這個問題,我還是建議你先看看MSDN技術(shù)文檔中關(guān)于鼠標(biāo)點(diǎn)擊方面的內(nèi)容,因?yàn)檫@些內(nèi)容是我們開展研究的起點(diǎn)。我也假定你基本了解鼠標(biāo)的單擊轉(zhuǎn)換為雙擊的基本工作原理。
在閱讀了相關(guān)的MSDN文檔之后,下面我們來看看文檔中的設(shè)計(jì)以及它如何影響你自己的用戶界面設(shè)計(jì)。
有些開發(fā)者將鼠標(biāo)雙擊動作設(shè)計(jì)為執(zhí)行不同于鼠標(biāo)單機(jī)的獨(dú)立任務(wù)。他們想知道是否可以在處理鼠標(biāo)雙擊消息時,安全的忽略掉WM_LBUTTONDOWN這個消息。
當(dāng)鼠標(biāo)按鈕被第一次按下的時候,窗口管理器不知道接下來會不會有第二次點(diǎn)擊。(有時候用戶自己可能也不知道) 所以它會發(fā)出WM_LBUTTONDOWN消息并等待后面的更多消息。
現(xiàn)在,假設(shè)你是一個程序員,你仍然希望繼續(xù)采用讓雙擊操作與單擊操作無關(guān)的設(shè)計(jì)方案。你會怎么做呢?
能想到的一種方法是,在收到 WM_LBUTTONDOWN 消息時不做任何事情,除了設(shè)置一個計(jì)時器以在 GetDoubleClickTime() 毫秒內(nèi)觸發(fā)。如果在該時間內(nèi)收到 WM_LBUTTONDBLCLK 消息,那么則認(rèn)為發(fā)生了雙擊動作。 如果沒有,那么它一定是單擊,因此可以執(zhí)行單擊操作(雖然稍微有些延遲)。
如果你沒有設(shè)計(jì)雙擊事件處理,那么,這種基于等待的技術(shù)方案也是必要的,但是第二次單擊與第一次單擊一起會導(dǎo)致麻煩。為什么這是必要的? 因?yàn)楹芏嘤脩粼趦H需要單擊的情況下,也會雙擊。以下是可以看到“避免第二次點(diǎn)擊的延遲操作”的一些示例:
> 為任務(wù)欄通知圖標(biāo)顯示的上下文菜單。如果第一次單擊時上下文菜單立即出現(xiàn),那么第二次單擊將關(guān)閉上下文菜單,讓用戶感到困惑。 “我點(diǎn)擊了一下,發(fā)生了一些事情,然后它就消失了。” (用戶不會說“我雙擊了”;他們只是說他們點(diǎn)擊了。雙擊是他們唯一知道怎么做的事情,所以他們只是稱之為“點(diǎn)擊”。舉個例子,如果你只有一輛車,那么,你不會說 “今天我開的是我的藍(lán)色車”。)
> 如果資源管理器處于一鍵模式,它會等待查看是否有第二次點(diǎn)擊,如果有,它會忽略它。 否則,當(dāng)人們雙擊時,他們會啟動該程序的兩個副本。 如果你禁止第二次點(diǎn)擊但不等待,那么他們啟動的程序就會卡在資源管理器窗口后面,因?yàn)橛脩粼趩映绦蚝簏c(diǎn)擊了資源管理器。
> XP 風(fēng)格的開始按鈕忽略第二次點(diǎn)擊。 否則,當(dāng)人們雙擊“開始”按鈕時,第一次單擊將打開“開始”菜單,第二次單擊將關(guān)閉它! (這有時被稱為“去抖動”。)
我們來看看一個關(guān)于延遲鼠標(biāo)點(diǎn)擊的實(shí)現(xiàn)代碼。
請注意,因?yàn)槲覀冋谔幚淼氖鞘髽?biāo)雙擊事件,所以這里我們需要將CS_DBLCLKS屬性打開。
wc.style = CS_DBLCLKS;
運(yùn)行此程序時,單擊并雙擊客戶區(qū)。 請注意,該程序直到雙擊超時后才會對單擊做出反應(yīng),因?yàn)樗诘却榭茨闶欠褚^續(xù)第二次單擊(因此是雙擊而不是單擊)。
后面我們會說說高于兩次的鼠標(biāo)點(diǎn)擊的情況。
畢竟操作系統(tǒng)不是神仙,它需要盡一切可能去理解用戶的點(diǎn)擊行為。
有時候,這真是太難了。
最后
Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關(guān)于Windows的小知識,對于廣大Windows平臺開發(fā)者來說,確實(shí)十分有幫助。
本文來自:《Logical consequences of the way Windows converts single-clicks into double-clicks》
最近我寫了個東西
正如你們所知道的,拓?fù)涿窢栔腔坜k公平臺(Topomel Box)是一款綠色軟件,主要面向經(jīng)常使用電腦的朋友。它提供了各種提升辦公效率的小功能,同時操作上盡可能地簡單方便。
我想:你值得擁有。
