Windows APIのSendInput()呼び出しを使用して、キーボードイベントをシミュレートしています。次のスニペット(無関係な詳細は省略)は、一連の文字を送信するために完全に機能します。
wchar_t txt = ...;
INPUT *input = ...;
size_t nInput = 0;
for (unsigned int j = 0; j < length; j++) {
input[nInput].ki.wVk = 0;
input[nInput].ki.wScan = txt[j];
input[nInput].ki.dwFlags = KEYEVENTF_UNICODE;
nInput++;
input[nInput].ki.wVk = 0;
input[nInput].ki.wScan = txt[j];
input[nInput].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
nInput++;
}
SendInput(nInput, input, sizeoF(INPUT));
現在、修飾子を使用して1回のキー押下を送信しようとしています。次のコードを試しました。
bool control, alt shift;
wchar_t chr;
if (control) {
input[nInput].ki.wVk = VK_CONTROL;
input[nInput].ki.dwFlags = 0;
nInput++;
}
if (alt) {
input[nInput].ki.wVk = VK_MENU;
input[nInput].ki.dwFlags = 0;
nInput++;
}
if (shift) {
input[nInput].ki.wVk = VK_SHIFT;
input[nInput].ki.dwFlags = 0;
nInput++;
}
input[nInput].ki.wVk = 0;
input[nInput].ki.wScan = chr;
input[nInput].ki.dwFlags = KEYEVENTF_UNICODE;
nInput++;
input[nInput].ki.wVk = 0;
input[nInput].ki.wScan = chr;
input[nInput].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
nInput++;
if (shift) {
input[nInput].ki.wVk = VK_SHIFT;
input[nInput].ki.dwFlags = KEYEVENTF_KEYUP;
nInput++;
}
if (alt) {
input[nInput].ki.wVk = VK_MENU;
input[nInput].ki.dwFlags = KEYEVENTF_KEYUP;
nInput++;
}
if (control) {
input[nInput].ki.wVk = VK_CONTROL;
input[nInput].ki.dwFlags = KEYEVENTF_KEYUP;
nInput++;
}
SendInput(nInput, input, sizeof(INPUT));
ただし、修飾子は通過しないようです。つまり、たとえばcontrol
trueに設定されていても、イベントシーケンスは単純なキー押下として受信されます。