5

英語以外の入力キーボード言語が 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 以外の文字を適切に出力できません。どちらか(アクセント文字など)。

前もって感謝します。

4

3 に答える 3

4

これを行う適切な方法は、キャラクターで呼び出してキャラクターの仮想キーコードを取得することであることがわかりVkKeyScanEx()ました。戻り値の上位バイトは、どの修飾キーを「押す」必要があるかを示します: Control、Alt、および/または Shift。下位バイトは実際の仮想キー コードです。

VK のスキャン コードを取得するには、次のように呼び出します。MapVirtualKeyEx(vkCode, 0);

次に、取得したばかりの情報を使用してキープレス シミュレーションを実行するだけです。

于 2009-12-28T23:48:50.477 に答える
1

.NET では、すべての文字列が内部的に Unicode (UTF-8) 文字列として保持されます。文字列を配列に変換することで確認できます (byte[]、char[] ではありません!)。そのため、スキャン コード、キーボード レイアウト、および仮想キーコードに関するものはすべて無視できます。

C#/.NET では次のように動作します。

string myText = "greekcyrillicjapaneseorwhathaveyou"; // can be input via a Forms textbox

char[] Mychars = myText.ToCharArray();

UInt16 uniCode = chars[5]; // if you want to simulate, say, the sixth' char of the string

...

ki.wScan = unicode

ki.dwFlags = KEYEVENTF_UNICODE;

...

于 2010-01-10T12:01:52.257 に答える
1

私が理解しているように、 SendInput() は、 mouse_event() および keybd_event() への呼び出しの単なるラッパーであり、入力がユーザーまたは他の呼び出し元からの入力に散在しないことを保証します。

だから私が持っている質問は、keybd_event() を試してみましたか?

于 2009-12-28T19:00:17.377 に答える