c++ - SendInput() 不等于在 C++ 键盘上手动按键?

标签 c++ winapi keyboard hook sendinput

我想编写一个 C++ 代码来模拟按下键盘键“A”:

// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;

// Press the "..." key
ip.ki.wVk = code; // virtual-key code for the "a" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));

// Release the "..." key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));

当我启动其他程序并等待我的程序执行时,它工作正常,单击“A”并且第一个程序对其使用react。但我发现在其他应用程序中我的操作以某种方式被阻止(我可以手动按键盘上的“A”,但使用我的程序不会导致任何操作)。

那么,我可以做些什么来使从程序中按“A”与手动按“A”更加相同(这样第二个程序就不会识别它是从程序中调用的)?

我没有第二个程序的源代码,也不知道它是如何识别“A”不是手动按下的。

我确定我想要对我的代码使用react的窗口是前台,接收并阻止我的 key (因此它可以确定事件不是来自用户而是来自程序)。

最佳答案

您也可以使用 SendInput() 发送硬件扫描码(与 DirectInput 可能会忽略的虚拟扫描码相反)。它的文档很少,但 SendInput() 确实可以绕过 DirectInput。 Eric 的解决方案不起作用的原因是他设置了硬件扫描码,但最终使用了虚拟扫描码(通过将 dwFlags 设置为 0 并将 wVk 设置为非零)。

本质上,做一个你想设置的按键:

ip.ki.dwFlags = KEYEVENTF_SCANCODE;

要进行 key 释放,请设置:

ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;

下面是一个完整的工作示例,它打印字母“a”。可以找其他扫码here .

#define WINVER 0x0500
#include <windows.h>

using namespace std;

int main()
{

    //Structure for the keyboard event
    INPUT ip;

    Sleep(5000);

    //Set up the INPUT structure
    ip.type = INPUT_KEYBOARD;
    ip.ki.time = 0;
    ip.ki.wVk = 0; //We're doing scan codes instead
    ip.ki.dwExtraInfo = 0;

    //This let's you do a hardware scan instead of a virtual keypress
    ip.ki.dwFlags = KEYEVENTF_SCANCODE;
    ip.ki.wScan = 0x1E;  //Set a unicode character to use (A)

    //Send the press
    SendInput(1, &ip, sizeof(INPUT));

    //Prepare a keyup event
    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));



    return 0;
}

注意:您可以通过向 SendInput() 传递一个 INPUT 结构数组来组合按键(例如,shift + a 代表 A)。

关于c++ - SendInput() 不等于在 C++ 键盘上手动按键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18647053/

相关文章:

ios - 警报键盘可以用于 iOS 上的任何文本字段吗?

iphone - 将 UIView/UIWindow 中的特定触摸事件传递给下一个响应者(sendEvent :/hitTest: doesn't work )

c++ - 重载new和delete运算符

c++ - 计数列表元素

c++ - Rabin-Karp 中的滚动哈希

c++ - 在 Windows 中设置子进程名称?

ios - 在返回键上以及在文本字段/ TextView 之外按下时关闭键盘

c++ - 在函数声明中包含参数名称与不包含参数名称有什么区别?

c++ - 将 x86 代码注入(inject) x64 进程

c# - GetShortPathNameA 在 C# 中不起作用