程序在后台运行,当用户鼠标双击时,就执行一些操作。
怎么能知道用户双击鼠标了?在网上找了两个钩子的例子
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要怎么处理?苦闷几天了!

解决方案 »

  1.   


    没有WM_LBUTTONDBLCLK....
      

  2.   

    WM_LBUTTONDOWN 也够用了!
    自己加一个计时判断!
      

  3.   

    双击需要WH_MOUSE类型的钩子,而在 Microsoft .NET 框架中,只发现WH_KEYBORAD_LL和WH_MOUSE_LL这两个low-level的hook可以被安装成全局的。
    Microsoft的说法:
    在 .NET 框架中不支持全局挂钩
    您无法在 Microsoft .NET 框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库 (DLL) 导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个 DLL 导出,而 .NET 框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
      

  4.   

    计时要怎么做?
    双击是:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDOWN、WM_LBUTTONUP
    单击是:WM_LBUTTONDOWN、WM_LBUTTONUP双击时
    第一个 WM_LBUTTONUP,这时如何区分是双击还是单击
      

  5.   

    WH_MOUSE 钩子,双击时会WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_LBUTTONDOWN、WM_LBUTTONUP,不好区分是单击还是双击。
      

  6.   

    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. SyntaxUINT GetDoubleClickTime(VOID);
    Return ValueThe return value specifies the current double-click time, in milliseconds. 
      

  7.   

    设一个时间t,初始状态是0
    每一次单击事件触发时,先判断t的值是否小于一个特定的数,如果小于则判定为双击,执行双击处理的函数,t清零并重新开始计时
      

  8.   

    14楼
    GetDoubleClickTime 返回双击的间隔有什么用?15楼
    双击,是2个单击
    我现在双击一次会先发出一个单击,后发出一个双击
    也就是一次双击会多出个单击,如何避免这个多余单击,不知道怎么解决。
      

  9.   

    一个双击会触发2个单击,然后根据2个单击的间隔计算是否发生了双击,
    你不是要求双击, 系统利用GetDoubleClickTime计算双击, 你不用它吗? 
      

  10.   

    17楼
    根据2个单击的间隔计算,可能判断出双击。
    现在问题是,当第一个单击发生后,就发出了一个单击事件。
    也就是说,一个完整的双击被分成:单击、双击、单击
    后一个单击,可以过虑,但前一个单击,我不知道如何过虑。
    用过Sleep,没用,处理第一个 WM_LBUTTONUP 消息,Sleep(GetDoubleClickTime()),
    下一个 WM_LBUTTONDOWN 消息是不会来的,只有等 Sleep 完才会传过来。
      

  11.   

    没看明白,你那个过程怎么形成的应该是这样的
    单击->(单击事件) 单击->(单击事件) 计算双击->(双击事件)
    单击->(单击事件) 单击->(单击事件) 计算双击->(双击事件)WM_LBUTTONDOWN 
    WM_LBUTTONUPint tick = GetTickCount();WM_LBUTTONDOWN 
    WM_LBUTTONUPint tmp = GetTickCount();if(tmp - tick < GetDoubleClickTime())
    {
    //DoSomeThing();
    }.....................
      

  12.   

    单击->(单击事件) 单击->(单击事件) 计算双击->(双击事件) 
    ----------------------------
    前面2个单击事件是多余,它们是双击的一部分,如何和正常的单击区分开。
      

  13.   

    处理第一个 WM_LBUTTONUP 消息时,用 Timer
    延迟 GetDoubleClickTime() 后,如有 WM_LBUTTONDOWN 消息,就不发出单击事件,认为是双击。
    (每次有 WM_LBUTTONDOWN 消息时,都保存当前 ticks)
    这里可以区分,问题是单击事件是从线程中发出的,想延迟只能放到其它线程中执行。
      

  14.   

    想延迟执行一些代码,又不影响当前线程的执行,好象只有新开一个线程,在新的线程中执行那些代码。
    Sleep 会使当前线程暂停执行。