3

我正在编写一个程序,到目前为止进展顺利,但是我对以下代码有疑问:

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 结构,而不是结构数组。

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

多谢你们。

编辑

新代码:

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);
    }
}

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

4

2 回答 2

2
sizeof(*inputs)*size

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

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

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

最后,您在释放任何一个键之前按下所有键。如果要键入文本,则应按顺序按下并释放每个键,以便一次按下的键不超过一个。

于 2012-05-29T13:15:38.393 回答
1

我想这是因为您只发送 KEYDOWN 消息。您可能想尝试先发送 KEYDOWN,然后再发送 KEYEVENTF_KEYUP 以获得相同的字符。

[编辑新代码]

一些提示:

  1. 删除 KEYEVENTF_SCANCODE
  2. string 用于 char 字符串,对于 UNICODE 使用 wstring
  3. 在测试您的功能之前,请确保某些带有编辑框的应用程序位于前台,例如记事本
于 2012-05-29T11:57:17.680 回答