英語以外の入力キーボード言語が Windows で使用されている場合、文字のキープレスをシミュレートするのに問題があります。
KEYEVENTF_UNICODE で SendInput() を呼び出してみました:
KEYBDINPUT ki;
INPUT input;
int character = 0;
ki.wVk = 0;
ki.wScan = character;
ki.dwFlags = KEYEVENTF_UNICODE;
ki.time = 0;
ki.dwExtraInfo = 0;
input.type = INPUT_KEYBOARD;
input.ki = ki;
SendInput(1, &input, sizeof(INPUT));
そして、これは実際に機能します (もちろん、私のコードでは、キーを押した後に KEYUP も行います)... GTK+ アプリを除きます (それが機能しない他のインスタンスがあるかもしれません)。
MSDNによると、KEYEVENTF_UNICODE が指定されている場合、SendInput は WM_KEYDOWN または WM_KEYUP メッセージを、wParam が VK_PACKET に等しいフォアグラウンド スレッドのメッセージ キューに送信します。GetMessage または PeekMessage がこのメッセージを取得すると、そのメッセージを TranslateMessage に渡すと、wScan によって最初に指定された Unicode 文字を含む WM_CHAR メッセージがポストされます。この Unicode 文字は、ANSI ウィンドウにポストされると、適切な ANSI 値に自動的に変換されます。
したがって、KEYEVENTF_UNICODE が渡されると、SendInput() の機能が異なると思います...通常ほど低レベルではありません。
私の人生では、SendInput() を取得して、ユーザーのキーボード言語に合わせて文字を適切に出力する他の方法を見つけることができません。たとえば、キーボード入力言語が「スウェーデン語」の場合、「@」を出力できず (代わりに引用符が出力されます)、ASCII 以外の文字を適切に出力できません。どちらか(アクセント文字など)。
前もって感謝します。