私はプログラムを書いていますが、これまでのところうまくいっていますが、次のコードに問題があります:
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!"));
ただし、タイプがキーボードに設定されていてもカーソルを移動するなど、すべきでないことはすべて実行します。最大で 1 文字を出力します。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);
}
}
これはまだ何も送信しません。