3

私はプログラムを書いていますが、これまでのところうまくいっていますが、次のコードに問題があります:

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

これはまだ何も送信しません。

4

2 に答える 2

2
sizeof(*inputs)*size

これは間違っています。cbSizeパラメーターは、配列の合計サイズではなく、1 つの構造体のサイズです。 INPUT

SendInput戻り値を破棄していなければ、これを発見していたでしょう。戻り値を確認することは、問題が発生した場合に可能な最も基本的なトラブルシューティングです。

メモリリークもあります。ZeroMemoryまた、配列を埋める前に配列で使用する必要があります。

最後に、キーを離す前にすべてのキーを押しています。テキストを入力する場合は、一度に複数のキーが押されないように、各キーを順番に押して離す必要があります。

于 2012-05-29T13:15:38.393 に答える
1

KEYDOWN メッセージのみを送信しているためだと思います。最初に KEYDOWN を送信してから、同じ文字に対して KEYEVENTF_KEYUP を送信してみてください。

[新しいコードの編集]

いくつかのヒント:

  1. KEYEVENTF_SCANCODE を削除
  2. string は char 文字列の場合、UNICODE の場合は wstring を使用します
  3. 関数をテストする前に、メモ帳など、編集ボックスを備えたアプリがフォアグラウンドであることを確認してください
于 2012-05-29T11:57:17.680 に答える