低级鼠标钩 - 鼠标按钮单击与保持

时间:2015-08-28 00:02:55

标签: c++ directx

我正在使用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);
}

如何添加支票以查看我是否点击了左键?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

我希望这会有所帮助。

答案 1 :(得分:0)

你需要使用计时技巧。创建一个名为' 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);
}