winapi - 如何通过程序发送硬件级键盘输入?

标签 winapi keyboard-events

我一直在使用keybd_event用于通过命令行进行键盘输入。然而,想要一些可以发送硬件级输入的东西,就像真正的键盘一样。

有什么适合我的目的吗?

我使用 Windows 作为操作系统。

最佳答案

我曾经使用SendInput来控制游戏角色。游戏(冰塔?)使用的是 directx 输入系统(我认为?)并且以某种方式忽略了 keybd_event 调用,但此方法有效。我不知道你需要与硬件有多接近,但这对我来说是个窍门。我使用了虚拟键码,但将它们转换为扫描码以获得此答案。

UINT PressKeyScan(WORD scanCode)
{
    INPUT input[1] = {0};
    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = NULL;
    input[0].ki.wScan = scanCode;
    input[0].ki.dwFlags = KEYEVENTF_SCANCODE;

    UINT ret = SendInput(1, input, sizeof(INPUT));

    return ret;
}

UINT ReleaseKeyScan(WORD scanCode)
{
    INPUT input[1] = {0};
    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = NULL;
    input[0].ki.wScan = scanCode;
    input[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;


    UINT ret = SendInput(1, input, sizeof(INPUT));

    return ret;
}

要模拟按下和释放,您可以按顺序使用它们(或者您可以为使用相同 INPUT 结构的按下和释放创建单独的函数)。

WORD scanCodeSpace = 0x39;
PressKeyScan(scanCodeSpace);
ReleaseKeyScan(scanCodeSpace)

您可以使用MapVirtualKeyA从虚拟键码中获取扫描码。

关于winapi - 如何通过程序发送硬件级键盘输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58028168/

相关文章:

c - InternetQueryOption、INTERNET_PER_CONN_OPTION 和 INTERNET_PER_CONN_FLAGS_UI 标志

winapi - 如何随意隐藏任务栏气球?

winapi - windows下设置单个线程为实时优先级

javascript - 使用 jQuery 创建一个简单的 JavaScript 类

linux - python 2.7 : How do I read single keypress in Linux (Including special characters)?

c# - 除了 WinAPI 之外,还有其他模拟用户鼠标输入的方法吗?

c++ - 回调函数和常规函数有什么区别?

javascript - 输入后执行函数

JQuery 在 keyup 后启动 2 个回调

.net - 为什么 UIElement.MoveFocus() 不将焦点移动到 ListBox 中的下一个同级元素?