2012-05-29 42 views
3

我写一个程序,它会很顺利,但是我有下面的代码的问题:问题与WinAPI的SendInput代码

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 ++调试器+ Code :: Blocks IDE。

谢谢你们。

编辑

NEW CODE:

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

这仍然没有发送。

+0

现在你已经没用了。内存泄漏仍然存在。在这个过程中,你超越了'buff'并摧毁了附近的内存。 –

回答

1

我想这是因为你只发送KEYDOWN消息。您可能想尝试发送第一个KEYDOWN,然后尝试发送相同字符的KEYEVENTF_KEYUP。

[编辑对新代码]

一些提示:

  1. 删除KEYEVENTF_SCANCODE
  2. 字符串是字符的字符串,为UNICODE使用测试你的函数之前wstring的
  3. 确保某些应用程序与编辑框是前景,例如记事本
+0

luskan,我现在已经实施了,但是我没有成功。更新了代码。我仍然相信它与INPUT数组有关。 – Shane

+0

看看我的编辑 – marcinj

+0

我已经记下了:) 并且非常感谢 - 它现在可行!我不能相信这是因为我没有使用unicode。 祝您有美好的一天! – Shane

2
sizeof(*inputs)*size 

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

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

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

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

+0

本,cbSize不是错误 - 我更新了源代码。但是我会删除它。谢谢。 ZeroMemory在整个阵列上一次?或者单独在每个索引上?你能解释一下你怎么知道我有这个内存泄漏吗? 所以我需要按一个,然后在继续之前释放一个? – Shane

+0

啊,我明白了。所以最后我只需要'删除[]输入'? 由于编译器错误,因此需要执行'INPUT *'强制转换。 – Shane

+0

@Shane:':: SendInput(1,curr,sizeof curr);'应该工作,不投。是的,'删除[]输入;'是正确的,但现在你已经添加了另一个分配。 –