程序在后台运行,当用户鼠标双击时,就执行一些操作。
怎么能知道用户双击鼠标了?在网上找了两个钩子的例子
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要怎么处理?苦闷几天了!
怎么能知道用户双击鼠标了?在网上找了两个钩子的例子
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_LBUTTONDBLCLK....
自己加一个计时判断!
Microsoft的说法:
在 .NET 框架中不支持全局挂钩
您无法在 Microsoft .NET 框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库 (DLL) 导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个 DLL 导出,而 .NET 框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
双击是:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDOWN、WM_LBUTTONUP
单击是:WM_LBUTTONDOWN、WM_LBUTTONUP双击时
第一个 WM_LBUTTONUP,这时如何区分是双击还是单击
Return ValueThe return value specifies the current double-click time, in milliseconds.
每一次单击事件触发时,先判断t的值是否小于一个特定的数,如果小于则判定为双击,执行双击处理的函数,t清零并重新开始计时
GetDoubleClickTime 返回双击的间隔有什么用?15楼
双击,是2个单击
我现在双击一次会先发出一个单击,后发出一个双击
也就是一次双击会多出个单击,如何避免这个多余单击,不知道怎么解决。
你不是要求双击, 系统利用GetDoubleClickTime计算双击, 你不用它吗?
根据2个单击的间隔计算,可能判断出双击。
现在问题是,当第一个单击发生后,就发出了一个单击事件。
也就是说,一个完整的双击被分成:单击、双击、单击
后一个单击,可以过虑,但前一个单击,我不知道如何过虑。
用过Sleep,没用,处理第一个 WM_LBUTTONUP 消息,Sleep(GetDoubleClickTime()),
下一个 WM_LBUTTONDOWN 消息是不会来的,只有等 Sleep 完才会传过来。
单击->(单击事件) 单击->(单击事件) 计算双击->(双击事件)
单击->(单击事件) 单击->(单击事件) 计算双击->(双击事件)WM_LBUTTONDOWN
WM_LBUTTONUPint tick = GetTickCount();WM_LBUTTONDOWN
WM_LBUTTONUPint tmp = GetTickCount();if(tmp - tick < GetDoubleClickTime())
{
//DoSomeThing();
}.....................
----------------------------
前面2个单击事件是多余,它们是双击的一部分,如何和正常的单击区分开。
延迟 GetDoubleClickTime() 后,如有 WM_LBUTTONDOWN 消息,就不发出单击事件,认为是双击。
(每次有 WM_LBUTTONDOWN 消息时,都保存当前 ticks)
这里可以区分,问题是单击事件是从线程中发出的,想延迟只能放到其它线程中执行。
Sleep 会使当前线程暂停执行。