为什么我的热键在 Win32 中使用“GetAsyncKeyState()”时出错

Why are my hotkeys bugging out when using `GetAsyncKeyState()` in Win32?

本文关键字:GetAsyncKeyState 出错 我的 Win32 为什么      更新时间:2023-10-16

main.c:

#include <stdio.h>
#include <windows.h>
#include <stdbool.h>
int main(void) {
    while (true) {
        if (GetAsyncKeyState(VK_CONTROL)) {
            if (GetAsyncKeyState('1')) {
                printf("Set grenades to 100!n");
                Sleep(500);
            }
        }
        Sleep(100);
    }
    return 0;
}

我尝试在调试和发布模式之间,在 mingw 和 VS 编译器之间切换,但我厌倦了 C 和 C++。在所有情况下都会发生相同的错误。

这个想法是为了让热键是 控制 + 1。每当用户同时按下 Control 键和 1 键时,我都希望运行代码printf("Set grenades to 100!n");

但是,有一个错误。如果用户按下并松开 1 键。等待任意时间(秒、分钟),然后按 Control 键,printf("Set grenades to 100!n");执行。

即使用户在两者之间按下键,也会发生此错误。例如:如果用户执行以下操作,则执行printf("Set grenades to 100!n");

  1. 按 1 键。
  2. 释放 1 键。
  3. 按下并释放以下键:"H"、"i"、"S"、"t"、"a"、"c"、"k"、"o"、"v"、"e"、"r"、"f"、"l"、"o"、"w"和"2"。
  4. 按下并松开控制键。

在步骤 4 中,执行代码。如何修复此错误?

我想使用 GetAsyncKeyState 而不是 GetKeyState,因为我希望即使用户切换到另一个程序也能捕获输入。

关于 GetAsyncKeyState() 的返回值,根据Microsoft如果设置了最高有效位,则键关闭
这里的一个重要要点是:对于有符号类型,例如 short当设置最高有效位,它被读取为负数GetAsyncKeyState()返回short .

这表明 代码中用于解释GetAsyncKeyState()结果的逻辑与当前应用程序中所需的逻辑相反。也就是说,您的条件语句应该检查负数而不是正数。

还有一点需要注意 :正如其他人所建议的那样,GetAsyncKeyState()的目的是现在检查密钥的状况。 但它的返回值还包含用于确定最近是否按下了键的信息。 事实上,这就是你通过查看LSB所做的。 在同一链接中,解释说LSB是近期状态的指标但是这不是推荐的做法。 最近的位状态可以由在另一个线程中运行的任何进程随时设置,因此,应谨慎使用。

所以,试试这个 。 我在 64 位窗口上对此进行了测试,它似乎工作正常,无论我先按 1 多少次,或按 ctrl 键,弹出窗口都不会发生。 但是,当我同时按下两者时,它会弹出。

#include <stdio.h>
#include <windows.h>
//#include <stdbool.h>//I did not need this, you might.
int main(void) {
    while (1) 
    {
        if (GetAsyncKeyState(VK_CONTROL)<0) 
        {
            if (GetAsyncKeyState('1')<0) 
            {
                printf("Set grenades to 100!n");
                Sleep(200);//changed here for my test, you might need to change again
            }
        }
        Sleep(200);//changed here for my test, you might need to change again
    }                                      
    return 0;//unreachable code warning
}
相关文章:
  • 没有找到相关文章