c++ - WinAPI SendInput 代码问题

标签 c++ winapi

我正在编写一个程序,到目前为止一切顺利,但是我遇到以下代码的问题:

void Send(string content) {
    unsigned int size = content.size();
    INPUT *inputs = new INPUT[size];

    for (unsigned int i = 0; i < size; i++) {
        inputs[i].type = 1;
        inputs[i].ki.wVk          = 0;//LOWORD(VkKeyScan(content.at(i)));
        inputs[i].ki.wScan        = content.at(i);
        inputs[i].ki.dwFlags      = KEYEVENTF_UNICODE | KEYEVENTF_SCANCODE;
        inputs[i].ki.time         = 0;
        inputs[i].ki.dwExtraInfo  = ::GetMessageExtraInfo();
    }

    SendInput(size, inputs, sizeof(*inputs)*size);

    for (unsigned int i = 0; i < size; i++) {
        inputs[i].ki.dwFlags &= KEYEVENTF_KEYUP;
    }

    SendInput(size, inputs, sizeof(*inputs)*size);
}

我想要实现的是能够像这样发送输入:

Send(string("Hello World!"));

但是,它会做所有不该做的事情,例如移动光标,即使类型设置为键盘。最多输出一个字符。 正如您在第 2 行看到的,我有一个 INPUT 数组。但是,当我在调试器中查看它时,它只是显示为单个 INPUT 结构,而不是结构数组。

我正在使用 g++ 和 gdb 调试器 + Code::Blocks IDE。

谢谢你们。

编辑

新代码:

void Send(string content) {
    unsigned int size = content.size();
    INPUT *inputs = new INPUT[size];
    INPUT curr[1];

    ZeroMemory(inputs, sizeof(*inputs)*size);

    for (unsigned int i = 0; i < size; i++) {
        inputs[i].type = 1;
        inputs[i].ki.wVk          = 0;//LOWORD(VkKeyScan(content.at(i)));
        inputs[i].ki.wScan        = content.at(i);
        inputs[i].ki.dwFlags      = KEYEVENTF_UNICODE | KEYEVENTF_SCANCODE;
        inputs[i].ki.time         = 0;
        inputs[i].ki.dwExtraInfo  = ::GetMessageExtraInfo();
    }

    for (unsigned int i = 0; i < size; i++) {
        curr[0] = inputs[i];            // Current input
        int a = ::SendInput(1, (INPUT*)&curr, sizeof(curr));

        inputs[i].ki.dwFlags &= KEYEVENTF_KEYUP;

        curr[0] = inputs[i];
        int b = ::SendInput(1, (INPUT*)&curr, sizeof(curr));

        TCHAR *buff = new TCHAR[3];

        wsprintf(buff, "%i %i", a, b);

        MessageBox(NULL, buff, "SendInput return vals", 0);
    }
}

这仍然没有发送任何内容。

最佳答案

sizeof(*inputs)*size

这是错误的,cbSize 参数是one INPUT 结构的大小,而不是数组的总大小。

如果您没有丢弃 SendInput 返回值,您就会发现这一点。检查返回值是出现问题时最基本的故障排除方法。

你也有内存泄漏。在填充数组之前,您应该在数组上使用 ZeroMemory

最后,您在释放任何键之前按下所有键。如果要键入文本,应按顺序按下和释放每个键,这样一次最多只能按下一个键。

关于c++ - WinAPI SendInput 代码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797615/

相关文章:

c++ - 32 位应用程序中的 WebBrowser 控件在 window.open() 调用上启动 64 位 Internet Explorer

c++ - 我怎样才能让我的模板类推断出函数指针模板参数的返回值和参数类型

c++ - 二次型矩阵与稀疏矩阵相乘的算法

c++ - 从 Linux 中的非子进程获取退出代码

c++ - 如何检测窗口已经最大化?

windows - 如何在 VB6 中执行更多代码之前等待 shell 进程完成

c - Win32 API 命名管道,所有管道实例都忙

C++ 比较运算符重载令人困惑的行为

c++ - 从 utsname 中找出 Linux 操作系统名称

c++ - 可用作数据类型的变量。