低级鼠标钩子 - 鼠标按钮单击与按住

Low level mouse hook - mouse button click vs hold

我正在使用 C++ 和 DirectD3D9 绘制菜单。 我想用鼠标浏览菜单。 我可以获得鼠标位置,但是,检查是否单击了左键被证明是棘手的。 我可以检查它是否被按住,但没有被点击。

bool LBUTTONDOWN = false;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN)) {
        LBUTTONDOWN = wParam == WM_LBUTTONDOWN;
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}

如何添加检查以查看是否单击了左侧按钮?

没有 LowLevelMouseProc 的 DoubleClick 消息。不过,我想你可以解决这个问题:

记录LBUTTONDOWN和LBUTTONUP之间的时间间隔,然后检查是否足够快成为点击事件。而且由于鼠标动作非常快,所以最好为鼠标捕捉设置一个定时器。

对于鼠标捕获,您仍然可以调用LowLevelMouseProc。但是,DirectInput更方便处理鼠标移动。

在 DirectX SDK 示例中,有一个名为 "CustomFormat" 的 DirectInput 示例。它显示了如何设置计时器来捕获鼠标输入。

希望对您有所帮助。

你需要使用计时技巧。创建一个名为 'nTime' 的变量, 当 LButton 向上时,将其设置为零。当 LButton 关闭时使用“+=”运算符增加变量值,并根据类似的值检查变量 -

bool LBUTTONDOWN = false;
int nTime = 0;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN)) 
    {
        LBUTTONDOWN = wParam == WM_LBUTTONDOWN;

        if ( LBUTTONDOWN )
        {
            nTime += 1;
            if ( nTime > 1000 /*( this value depends on you )*/ )
            {
                nTime = 0;
                // Here is your hold event code.
            }
        }
        else
            nTime = 0;
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}