Windows将鼠标单击转换为双击的原理鼠标变成双击

对于这个问题,我还是建议你先看看MSDN技术文档中关于鼠标点击方面的内容,因为这些内容是我们开展研究的起点。我也假定你基本了解鼠标的单击转换为双击的基本工作原理。

在阅读了相关的MSDN文档之后,下面我们来看看文档中的设计以及它如何影响你自己的用户界面设计。

首先,有些开发者将鼠标双击动作设计为执行不同于鼠标单机的独立任务。他们想知道是否可以在处理鼠标双击消息时,安全的忽略掉WM_LBUTTONDOWN这个消息。

当鼠标按钮被第一次按下的时候,窗口管理器不知道接下来会不会有第二次点击。(有时候用户自己可能也不知道) 所以它会发出WM_LBUTTONDOWN消息并等待后面的更多消息。

现在,假设你是一个程序员,你仍然希望继续采用让双击操作与单击操作无关的设计方案。你会怎么做呢?
能想到的一种方法是,在收到 WM_LBUTTONDOWN 消息时不做任何事情,除了设置一个计时器以在 GetDoubleClickTime() 毫秒内触发。如果在该时间内收到 WM_LBUTTONDBLCLK 消息,那么则认为发生了双击动作。 如果没有,那么它一定是单击,因此可以执行单击操作(虽然稍微有些延迟)。

如果你没有设计双击事件处理,那么,这种基于等待的技术方案也是必要的,但是第二次单击与第一次单击一起会导致麻烦。为什么这是必要的? 因为很多用户在仅需要单击的情况下,也会双击。以下是可以看到“避免第二次点击的延迟操作”的一些示例:

> 为任务栏通知图标显示的上下文菜单。如果第一次单击时上下文菜单立即出现,那么第二次单击将关闭上下文菜单,让用户感到困惑。 “我点击了一下,发生了一些事情,然后它就消失了。” (用户不会说“我双击了”;他们只是说他们点击了。双击是他们唯一知道怎么做的事情,所以他们只是称之为“点击”。举个例子,如果你只有一辆车,那么,你不会说 “今天我开的是我的蓝色车”。)

> 如果资源管理器处于一键模式,它会等待查看是否有第二次点击,如果有,它会忽略它。 否则,当人们双击时,他们会启动该程序的两个副本。 此外,如果你禁止第二次点击但不等待,那么他们启动的程序就会卡在资源管理器窗口后面,因为用户在启动程序后点击了资源管理器。

> XP 风格的开始按钮忽略第二次点击。 否则,当人们双击“开始”按钮时,第一次单击将打开“开始”菜单,第二次单击将关闭它! (这有时被称为“去抖动”。)

接下来,我们来看看一个关于延迟鼠标点击的实现代码。

请注意,因为我们正在处理的是鼠标双击事件,所以这里我们需要将CS_DBLCLKS属性打开。
wc.style = CS_DBLCLKS;

运行此程序时,单击并双击客户区。 请注意,该程序直到双击超时后才会对单击做出反应,因为它正在等待查看你是否要继续第二次单击(因此是双击而不是单击)。

后面我们会说说高于两次的鼠标点击的情况。

总结

毕竟操作系统不是神仙,它需要尽一切可能去理解用户的点击行为。
有时候,这真是太难了。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Logical consequences of the way Windows converts single-clicks into double-clicks》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注