监视鼠标双击事件的问题,请人帮忙!!!
程序在后台运行,当用户鼠标双击时,就执行一些操作。
怎么能知道用户双击鼠标了?
在网上找了两个钩子的例子
http://www.codeproject.com/KB/cs/globalhook.aspx
http://www.codeproject.com/KB/system/globalsystemhook.aspx
里面都没有鼠标双击事件。只有鼠标单击的键、鼠标坐标等信息。
WH_MOUSE_LL 类型的钩子没有 WM_LBUTTONDBLCLK 这样的东西,不能判断双击。
只有WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP
要怎么处理?苦闷几天了!
------解决方案--------------------WM_LBUTTONDOWN 也够用了!
自己加一个计时判断!
------解决方案--------------------双击需要WH_MOUSE类型的钩子,而在 Microsoft .NET 框架中,只发现WH_KEYBORAD_LL和WH_MOUSE_LL这两个low-level的hook可以被安装成全局的。
Microsoft的说法:
在 .NET 框架中不支持全局挂钩
您无法在 Microsoft .NET 框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库 (DLL) 导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个 DLL 导出,而 .NET 框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
------解决方案--------------------WH_MOUSE 钩子,双击时会WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_LBUTTONDOWN、WM_LBUTTONUP,不好区分是单击还是双击。
------解决方案--------------------The GetDoubleClickTime function retrieves the current double-click time for the mouse. A double-click is a series of two clicks of the mouse button, the second occurring within a specified time after the first. The double-click time is the maximum number of milliseconds that may occur between the first and second click of a double-click.
Syntax
UINT GetDoubleClickTime(VOID);
Return Value
The return value specifies the current double-click time, in milliseconds.
------解决方案--------------------设一个时间t,初始状态是0
每一次单击事件触发时,先判断t的值是否小于一个特定的数,如果小于则判定为双击,执行双击处理的函数,t清零并重新开始计时
------解决方案--------------------一个双击会触发2个单击,然后根据2个单击的间隔计算是否发生了双击,
你不是要求双击, 系统利用GetDoubleClickTime计算双击, 你不用它吗?
------解决方案--------------------没看明白,你那个过程怎么形成的
应该是这样的
单击->(单击事件) 单击->(单击事件) 计算双击->(双击事件)
单击->(单击事件) 单击->(单击事件) 计算双击->(双击事件)
WM_LBUTTONDOWN
WM_LBUTTONUP
int tick = GetTickCount();
WM_LBUTTONDOWN
WM_LBUTTONUP
int tmp = GetTickCount();
if(tmp - tick < GetDoubleClickTime())
{
//DoSomeThing();
}
.....................
------解决方案--------------------
处理第一个 WM_LBUTTONUP 消息时,用 Timer
延迟 GetDoubleClickTime() 后,如有 WM_LBUTTONDOWN 消息,就不发出单击事件,认为是双击。
(每次有 WM_LBUTTONDOWN 消息时,都保存当前 ticks)
这里可以区分,问题是单击事件是从线程中发出的,想延迟只能放到其它线程中执行。
------解决方案--------------------想延迟执行一些代码,又不影响当前线程的执行,好象只有新开一个线程,在新的线程中执行那些代码。
Sleep 会使当前线程暂停执行。