-1

キーストロークを別のウィンドウに送信するプログラムを作成していて、すべて機能するようになりましたが、オンラインでキーストローク部分自体を実行する関数を見つける必要がありました。動作しますが、実際に何をしているのかわかりません。誰かがこの関数の各行にコメントして、それが何をしているのかを説明できますか?

void GenerateKey(int vk, BOOL bExtended) {

    KEYBDINPUT  kb = {0};
    INPUT       Input = {0};

    /* Generate a "key down" */
    if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
    kb.wVk  = vk;
    Input.type  = INPUT_KEYBOARD;
    Input.ki  = kb;
    SendInput(1, &Input, sizeof(Input));

    /* Generate a "key up" */
    ZeroMemory(&kb, sizeof(KEYBDINPUT));
    ZeroMemory(&Input, sizeof(INPUT));
    kb.dwFlags  =  KEYEVENTF_KEYUP;
    if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
    kb.wVk = vk;
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;
    SendInput(1, &Input, sizeof(Input));

    return;
}

これを呼び出す例を次に示します。

GenerateKey('C', FALSE);    // Sends keystroke 'c'

これにより、キーストローク 'c' が送信されます。

この関数は大文字でのみ機能し、特定の 16 進コードでのみ機能するようです。たとえば、キャリッジ リターン (Enter キー) を送信するには、次のように呼び出します。

GenerateKey(0x0D, FALSE);   // Sends carriage return

ただし、これらの呼び出しのいずれかで疑問符 (hex 0x3F) を送信しようとしても、何も起こりません。

GenerateKey(0x3F, FALSE);  // Nothing happens
GenerateKey('?', FALSE);   // Nothing happens

なぜそれらが機能しないのか、誰にもわかりますか?

また、誰かが 2 番目の引数 BOOL bExtended の目的を説明できますか? TRUE と FALSE の間で変更しても、送信されるキーストロークに違いはないようです。

4

1 に答える 1

4

関数は、キーボード入力を合成する Win32 APIの関数GenerateKeyを内部的に使用します。SendInput

その関数の仕組みとその呼び出し方法を理解するために必要なすべての情報は、その関数のMSDN ドキュメントを読むことで見つけることができます。

vkパラメータは、ここにリストされている仮想キー コードです

bExtendedパラメータがの場合TRUEKEYEVENTF_EXTENDEDKEYフラグが設定されます。これは、ドキュメントによると、 「スキャン コードの前に値 0xE0 (224) を持つプレフィックス バイトがあった」ことを意味します。

于 2012-01-01T18:45:16.817 に答える