【问题标题】:why does the "If GetAsyncKeyState" sends Button infinitely?为什么“If GetAsyncKeyState”会无限发送 Button?
【发布时间】:2023-03-26 03:36:01
【问题描述】:

我想制作一个只有在我按下它时才会无限发送空间的宏,问题是即使我离开按钮后它也会发送它。

DWORD WINAPI BhopThread(LPVOID lp)
{
    while (true)
    {
        if (bhop)
        {
            if (GetAsyncKeyState(VK_SPACE))
                {
                Sleep(10);
                keybd_event(0x20, 0, 0, 0);
                Sleep(1);
                keybd_event(0x20, 0, KEYEVENTF_KEYUP, 0);
                Sleep(10);
                }
        }
    }
}

我做错了什么?

【问题讨论】:

    标签: c++ macros hotkeys


    【解决方案1】:

    您必须检查GetAsyncKeyState() 函数的返回值的最高位,以确定当前是否按下了它们的键。

    GetAsyncKeyState() function

    如果函数成功,则返回值指定自上次调用 GetAsyncKeyState 以来是否按下了键,以及该键当前是向上还是向下。如果设置了最高有效位,则按键按下,如果设置了最低有效位,则在上一次调用 GetAsyncKeyState 之后按下了按键。但是,您不应依赖最后一种行为;

    简单地说,这意味着GetAsyncKeyState() 不仅返回真或假,还返回范围广泛的值。要确定该键当前是否真的被按下,也就是按下,您需要使用一个 位运算符,其值为 0x8000

    检查 Space 键当前是否被按住的示例:

    if(GetAsyncKeyState(VK_SPACE) & 0x8000)
    {
        // high bit is set.  Space is currently held down.
    } 
    

    什么是位运算符?

    这太宽泛了,无法在此答案中进行解释。我建议您阅读一些基本的 C++ 书籍/文档/教程。

    https://en.wikipedia.org/wiki/Bitwise_operation#AND

    【讨论】:

    • 这是我在 C++ 中的第一个小时,我没有理解你写的一个句子,你能解释一下我做错了什么以及它是如何正确制作的
    • 保持动力,做一些基本的 c++ 教程,也阅读一些关于 c++ 的书籍。顺便提一句。看我的编辑。虽然您的问题很宽泛,但我们提供了一个可行的解决方案
    • GetAsyncKeyState()的返回值是signed short,高位是符号位,所以也可以用if(GetAsyncKeyState(VK_SPACE) < 0)代替。当符号位为 1 时,有符号值为负数
    • @Kierak 这个答案很清楚。不可能做出更好的答案,因为它是完美的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2015-10-15
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多