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