C++ 如何使用GetAsyncKeyState查看按键已按下x秒

C++ 如何使用GetAsyncKeyState查看按键已按下x秒,c++,windows,winapi,mouse,C++,Windows,Winapi,Mouse,我正在尝试创建一个代码来检测是否按下了鼠标按钮。到目前为止,我有一个代码,可以检测按钮是否按下过一次。但它不允许我检查按钮是否持续按下。例如,按下鼠标左键,这将启动计时器,0.5秒后,它将再次检查,如果仍处于下降状态,则输出一些内容 我想把它设置成这样 while (true) { if (GetAsyncKeyState(VK_LBUTTON) & (0x8000 != 0)) { cout << ("left button presse

我正在尝试创建一个代码来检测是否按下了鼠标按钮。到目前为止,我有一个代码,可以检测按钮是否按下过一次。但它不允许我检查按钮是否持续按下。例如,按下鼠标左键,这将启动计时器,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;
        }

    }
}
while(true)
{
if(GetAsyncKeyState(VK_LBUTTON)&(0x8000!=0))
{

cout如果您试图在WINAPI GUI应用程序中实现这一点,您的答案是-在WM_LBUTTONDOWN上写入第一个时间戳,在WM_LBUTTONUP上写入第二个时间戳,并计算所需的运行时间。实际上更好的是,它只捕获将进入应用程序窗口的消息,而不会捕获其他应用程序的按键您可以使用GetAsyncKeyState

更新:无论如何,使用标准的windows消息处理(因为它是基于事件的,对程序员来说更自然)让用户生成的数据(如点击、按键等)工作起来更好与其每隔一段时间检查一次对象的状态,您可能会完全错过所需的事件。看起来您正在尝试解决问题


UPDATE2:是一个很好的教程,介绍如何正确地执行此操作。

GetAsyncKeyState
只是告诉您当前的状态,不应使用它来监视可能随时间发生的更改

如果无论哪个应用程序正在接收输入,都要跟踪鼠标,则应使用安装

如果您只关心自己窗口中的鼠标事件,那么最好按照另一个答案中的建议跟踪WM_LBUTTON*鼠标消息


为了响应WM_LBUTTONDOWN,您将全局标志设置为true并启动计时器。为了响应WM_LBUTTONUP,您将其设置为false并停止计时器。如果计时器启动且标志为true,则执行所需任务。

0x8000始终不等于0,请正确放置括号。最简单的测试方法是使用
If(GetAsyncKeyState(VK_LBUTTON)<0)
。现在您知道为什么GetAsyncKeyState()具有非常不寻常的短返回类型。处理
WM_LBUTTONDOWN
WM_LBUTTONUP
不允许您在超时时做出响应。您必须实现一个来确定按钮何时按了预定义的间隔。此外,问题是询问物理键状态。建议使用每线程viRTuilized input无法满足此要求。您必须询问投票人,但我想原因与我的评论中概述的原因类似。@I当然不可检测,这里需要计时器。例如,QueryPerformanceFrequency/QueryPerformanceCounter函数可以做到这一点。另一方面,在两次之间的时间很短的情况下,单击按钮两次n将破解OP提出的解决方案。另外,Sleep(),IMHO,在几乎任何情况下都不适合使用:它挂起处理线程,使其无法接收任何其他事件。我甚至不会提到它的可靠性……我还想补充一点,按下和释放按钮是两个不同的事件,它们应该作为两个不同的事件处理。@IInspectable这保证了y你不会遇到在要求的持续时间内多次按下按钮的问题-向上键总是跟随向下键。此外,我发现很难确定OP需要物理键状态。你试图帮助尝试解决问题,而不是问题本身。如果OP能描述他到底是什么,那会更有帮助试着去做。我不是说你错了,但你回答了一个不同的问题。无论如何,我不能代表对你建议的答案投了票的人说话,我解释了为什么我没有投赞成票。