C++ winapi GetAsyncKeyState()无法按说明工作?

C++ winapi GetAsyncKeyState()无法按说明工作?,c++,winapi,keyboard,C++,Winapi,Keyboard,据推测,GetAsyncKeyState()是 确定调用函数时键是向上还是向下 我一直在构建一个UI自动化库,问题归结到这一点 #include <Windows.h> #include <iostream> #include <chrono> #include <thread> using namespace std; bool IsKeydownAsync(int key) { return GetAsyncKeyState(key)

据推测,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));
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
bool iskeydownsync(int键){
返回GetAsyncKeyState(键)&0x8000;
}
int main(){
而(1){
if(IsKeydownAsync('A')){

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


一些较旧的游戏使用以前版本的DirectX和其他捕获输入的方法,例如使用名为XInput的库(2)自Windows 8.1/10以来,它就被弃用了。虽然轮询和事件/MSG都受支持,但输入是使用DirectX线程捕获的,处理方式与Windows API完全不同。主要原因是操作系统试图迎合所有制造商,而DirectX API没有具体解决该问题对于输入。

您要注意文档的返回值和备注部分。
GetAsyncKeyState
可能不是输入处理或UI自动化的最佳选择。您应该使用其他方法。@VTT返回值和备注部分只提到LSB不可靠,但我只测试MSB,以确定是否不可靠钥匙坏了。我想用RAWINPUT,但那将是我最后的选择,因为我对RAWINPUT不太熟悉it@ShawnLi你能明确地提到破坏这种行为的游戏吗?我理解正确了吗:你在记事本中按A键,然后你的程序显示“已触发”,但如果你在你提到的其中一个游戏中按A键“触发"不再显示?众所周知,游戏使用原始输入读取键盘,在通过正常管道进行处理之前拦截击键。这是一种非常廉价的防作弊方法,只能通过修补驱动程序来破解。第一段仅适用于同步功能,而不适用于
GetAsyncKeyState
。获取AsyncKeyState返回更多的“关联中断级别状态”信息,但它仍然在同一操作系统虚拟键层中流动。听起来很奇怪,这仍然不同于驱动程序对键盘的了解,这也是DirectInput/XInput返回的内容。真的不想编写驱动程序……但似乎这是唯一一个选项