我正在编写一个程序,到目前为止进展顺利,但是我遇到了以下代码的问题:
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);
}
}
这仍然没有发送任何内容。
答案 0 :(得分:2)
sizeof(*inputs)*size
这是错误的,cbSize
参数是一个 INPUT
结构的大小,而不是数组的总大小。
如果你没有丢弃SendInput
返回值,你会发现这个。检查返回值是出现问题时最基本的故障排除方法。
你也有内存泄漏。在填充之前,您应该在数组上使用ZeroMemory
。
最后,你在释放任何键之前按下所有键。如果要键入文本,则应按顺序按下并释放每个键,这样一次只能按下一个键。
答案 1 :(得分:1)
我想这是因为你只发送KEYDOWN消息。您可能想尝试先为KEYDOWN发送,然后为同一个字符发送KEYEVENTF_KEYUP。
[编辑新代码]
一些提示: