【发布时间】:2012-05-29 10:47:56
【问题描述】:
我正在编写一个程序,到目前为止一切顺利,但是我对以下代码有疑问:
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);
}
}
这仍然没有发送任何内容。
【问题讨论】:
-
现在你有无用的演员表。内存泄漏仍然存在。而且您正在超越
buff并在此过程中破坏附近的内存。