如何在C ++中模拟按下键

问题描述

让我更具体一点。

我正在尝试模拟正在使用的游戏宏机器人中的向前走...

此游戏通过我的Chrome浏览器运行。我需要用此代码来完成的工作是在记事本中或由于按住键而产生“ wwwwwwwwwwwwww”。

据我所知,这不是兼容性错误,而是逻辑错误...

这是我的路障的一个简单例子:

#include <windows.h>

void keyPress(WORD keyCode) 
{
    INPUT input;
    input.type = INPUT_KEYBOARD;

    input.ki.wVk = keyCode;
    input.ki.dwFlags = 0;
    sendinput(1,&input,sizeof(input)); // Press key?

    Sleep(3000); // Key suppose to be held for 3 seconds but isnt??

    input.ki.dwFlags = KEYEVENTF_KEYUP;
    sendinput(1,sizeof(input)); // Release key?
}

int main()
{
    keyPress(0x57); // 0x57 = W key code
    return 0;
}

sendinput()似乎是用于按键模拟的函数,但是如果我要使用其他功能,请分享

谢谢。

解决方法

解决方案:好的,通过进一步的经验,似乎我原始代码的问题是dwFlags中缺少KEYEVENTF_SCANCODE。似乎存在一种基础关系,需要KEYEVENTF_SCANCODE标志才能至少在Chrome(可能是系统范围内)中按住箭头键。因此,这是一个简单的解决方案:

#include <windows.h>

void keyPress(WORD keyCode)
{
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = keyCode;
    input.ki.dwFlags = KEYEVENTF_SCANCODE;

    SendInput(1,&input,sizeof(INPUT));
}

void keyRelease(WORD keyCode)
{
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = keyCode;
    input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;

    SendInput(1,sizeof(INPUT));
}

int main()
{
    Sleep(5000); // pause time to open browser tab
    keyPress(0x24); // press key
    Sleep(1000); // hold key for x milliseconds
    keyRelease(0x24); // release key
    return 0;
}

我很困惑,为什么扫描代码无法与Microsoft提供的代码一致(“ 0x25”是向下箭头而不是“ 0x28”?),所以如果有人对此有所了解,那很棒。

解决方案编辑:我的键码未排列的原因是因为我需要使用扫描码。我运气不好,因为我正在打游戏的游戏也使用IJKL作为箭头键,所以看起来好像代码总是偏离了几个数字,而实际上却一直按字母键。因此,基本上我要做的就是使用这些扫描代码移动:0x17 =“ I” 0x24 =“ J” 0x25 =“ K” 0x26 =“ L”

我希望这可以帮助像我一样迷失的人(:

也是专家提示,用python编写宏bot,它的麻烦要小得多。我放弃了c ++代码,并在2个晚上使代码在python上运行

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...