首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinAPI SendInput代码的问题

WinAPI SendInput代码的问题
EN

Stack Overflow用户
提问于 2012-05-29 10:47:56
回答 2查看 1.4K关注 0票数 3

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

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
Send(string("Hello World!"));

然而,它做了所有不应该做的事情,比如移动光标,即使类型被设置为键盘。最多只能输出一个字符。正如您在第2行所看到的,我有一个输入数组。但是,当我在调试器中看到这一点时,它看起来只是一个单一的输入结构,而不是一个结构数组。

我使用g++与gdb调试器+代码::块IDE。

谢谢你们。

编辑

新代码:

代码语言:javascript
复制
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);
    }
}

这还是没发什么信号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-29 11:57:17

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

编辑新代码

很少有提示:

KEYEVENTF_SCANCODE

  • string是用于字符字符串的
  1. remove
  2. ,在测试功能之前,请确保某个带有编辑框的应用程序是前台的,例如记事本

票数 1
EN

Stack Overflow用户

发布于 2012-05-29 13:15:38

代码语言:javascript
复制
sizeof(*inputs)*size

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

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

你的记忆也有漏洞。在填充数组之前,应该在数组上使用ZeroMemory

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10797615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档