winapi GetAsyncKeyState()不能像描述的那样工作?

时间:2017-12-18 10:17:55

标签: c++ winapi keyboard

根据microsoft's documentation,GetAsyncKeyState()据说是

  

确定在调用函数时键是向上还是向下

我一直在构建一个UI自动化库,问题归结为此

#include <Windows.h>
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;

bool IsKeydownAsync(int key) {
    return GetAsyncKeyState(key) & 0x8000;
}

int main(){
    while (1) {
        if (IsKeydownAsync('A')) {
            cout << "triggered" << endl;
        }
        this_thread::sleep_for(chrono::milliseconds(10));
    }
}

所以我的理解是,无论我的应用程序是否处于焦点状态都无关紧要,GetAsyncKeyState()应始终返回物理键在被调用时是向上还是向下。

我已经在各种应用程序中对此进行了测试,并且大多数时候它的行为与描述的一样。但是,在某些游戏中,此行为会中断,并且不再报告该键是启用还是关闭。

。当密钥被保持时,cout << "triggered" << endl不会被调用。

有什么我忽略的吗?

1 个答案:

答案 0 :(得分:1)

自从我使用Windows中的本机输入以来已经有一段时间了,但根据经验,Windows API函数仅报告使用同步Windows API功能报告的关键状态,也就是说正常的应用程序消息/事件输入。

一些较旧的游戏使用以前版本的DirectX以及捕获输入的其他方式,例如使用自Windows 8.1 / 10以来已弃用的名为XInput(2)的库。虽然支持polling和events / msgs,但使用DirectX线程捕获输入,并且与Windows API相比,处理完全不同。其主要原因是操作系统试图满足所有制造商的需求,而DirectX API并没有具体解决输入问题。