如何使用 GetAsyncKeyState 查看按键被按下 x 秒

How to use GetAsyncKeyState to see key was pressed for x seconds

我正在尝试创建一个代码来检测是否按下了鼠标按钮。到目前为止,我有一个代码可以检测按钮是否被按下一次。但它不允许我检查按钮是否被连续按下。例如按下鼠标左键,这将启动一个计时器,在 0.5 秒后它将再次检查,如果它仍然按下输出一些东西。

我想这样设置

while (true)
{

    if (GetAsyncKeyState(VK_LBUTTON) & (0x8000 != 0))
    {

        cout << ("left button pressed") << endl;
        Sleep(500);
        if (GetAsyncKeyState(VK_LBUTTON) & (0x8000 != 0))
        {

            cout << ("Left button held down") << endl;
        }

    }
}

但是,它不起作用,如果我连续快速双击,它只输出第二条语句。

Determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState.

msdn网站是这么说的。这是否意味着我应该在时间过后检查它是否已启动以获得我想要的结果。

如果您尝试在 WINAPI GUI 应用程序中实现它,here 就是您的答案 - 在 WM_LBUTTONDOWN 上写下第一个时间戳,在 WM_LBUTTONUP 上写下第二个时间戳,然后计算你需要的流逝时间。实际上更好的是 - 它只会捕获将进入您的应用程序 window 的消息,而不会像您使用 GetAsyncKeyState 那样捕获其他应用程序的按键操作。

更新:无论如何,使用标准 windows 消息处理(因为它是 event-based,让 user-generated 数据(如点击、按键等)工作更好对程序员来说更自然)而不是每一段时间检查一次对象的状态——你可能会完全错过所需的事件。您似乎正在尝试解决 XY 问题。

更新 2:Here 是一个很好的教程,介绍了如何正确执行此操作。

GetAsyncKeyState 只是告诉你现在的状态,它不应该用来监视随时间可能发生的变化!

如果无论哪个应用程序正在接收输入都想跟踪鼠标,那么您应该使用 SetWindowsHookEx to install a low-level mouse hook

如果您只关心自己 window 中的鼠标事件,那么最好按照其他答案中的建议跟踪 WM_LBUTTON* 鼠标消息。

为了响应 WM_LBUTTONDOWN,您将全局标志设置为 true 并启动计时器。作为对 WM_LBUTTONUP 的响应,您将其设置为 false 并停止计时器。如果计时器触发并且标志为真,则执行您想要的任务。