続きはWhat is the correct, modern way to handle arbitrary text input in a custom control on Windows? WM_CHAR? IMM? TSF?です。TranslateMessage()は無条件に0以外の値を返すので、翻訳の前か後に翻訳が行われたかをどのように伝えることができますか?
非IMEレイアウト(米国英語)、非TSF IME(Windows XP DDKの日本語FAKEIME)、TSFテキストサービス(Windows 7に付属するもの)を試した後、アクティブな入力プロセッサプロファイルがTSFテキストサービスでない場合(すなわち、TF_PROFILETYPE_KEYBOARDLAYOUT
)、私はキー入力とWM_CHAR
のテキスト入力を処理する必要があります。
私のアーキテクチャでは、テキスト入力メッセージに変換されたため、現在のキーメッセージを無視できることを伝える方法が必要です。これが翻訳の前後に起こるかどうかは気にしません。そのような翻訳が起こるかどうかを知る必要があります。または擬似コードの用語で:
// if I can suppress WM_CHAR generation and synthesize it myself (including if the translation is just dead keys)
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
if (WillTranslateMessage())
InsertChar(GenerateEquivalentChar());
else
HandleRawKeyEvent();
break;
// if I can know if a WM_CHAR was generated (or will be generated; for instance, in the case of dead keys)
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
if (!DidTranslateMessage())
HandleRawKeyEvent();
break;
case WM_CHAR:
case WM_SYSCHAR:
InsertChar(wParam);
break;
キーボードからまたは非TSF IMEのいずれかを介して、テキスト入力を処理する標準的な方法は、TranslateMessage()
はWM_KEYDOWN
-to- WM_CHAR
翻訳を行うようにすることです。しかし、問題があります:MSDNは、メッセージがWM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、またはWM_SYSKEYUPである場合、戻り値は関係なく、翻訳の、ゼロでない
を言います。
つまり、翻訳が行われたかどうかを判断するために使用することはできません。
いくつかのマイケル・カプランのブログの記事を読んだ後、私は私がGetKeyboardState()
から状態配列を渡し、変換を自分で行うことをToUnicode()
またはToUnicodeEx()
を使用することができます考え出しました。 The wine source code seems to agreeが、それは、彼らがワインに固有であるかだけでなく、実際のWindows上で実行する必要があれば、私はよく分からない2つの特殊なケースがあります。
VK_PACKET
は - から直接WM_CHAR
を生成し、メッセージのLPARAM
VK_PROCESS
- 関数ImmTranslateMessage()
を呼び出します。これは、ワイン固有関数または文書化されていないimm32.dll関数のいずれかと思われます。私は本当であると言うことができません
また、ワインは何もしませんWM_KEYUP
とWM_SYSKEYUP
;再び、私はこれがワインだけに当てはまるかどうかわかりません。
しかし、TSFを使用するプログラムでこれらのケースについても心配する必要はありますか?そしてもし私がそうしたら、それを行う "公式の"方法は何ですか?それでは、私は何をするでしょうかWM_KEYUP
/WM_SYSKEYUP
;それらをToUnicode()
にも送信する必要がありますか? WM_CHAR
があった場合は、特に私のウィンドウでWM_KEYUP
をキャッチする必要がありますか?
または、私はTSFがTF_PROFILETYPE_KEYBOARDLAYOUT
プロセッサの世話をすることを許可するMSDN TSFサンプルに含まれていないものを紛失していますか?私はTSFが透過的なIMEパススルーを行ったと思ったが、FAKEIMEサンプルを使った私の実験はそうでなければ...?私はFirefoxとChromiumの両方がTF_PROFILETYPE_KEYBOARDLAYOUT
をチェックし、ImmGetIMEFileName()
を使用してキーボードレイアウトがIMEでサポートされているかどうかを確認することもできますが、実際にこれらのケースで入力を処理するかどうかはわかりません...
私の最小バージョンは今のWindows 7
おかげです。
更新この質問のオリジナルバージョンは、関連するWM_KEYUP
を知る必要があります。他のプラットフォームで同等のコードを2度目に見ると、後でTranslateMessage()
の部分を除いて、これは必要ではありません。私はそれに応じて質問を調整しました。 (OS Xでは、キー入力イベントをテキスト入力システムに与えることさえできません; GTK +では、文字を挿入するキーが押されているように見えますが、リリースでは気にならず、とにかく処理されません。私が試したインプットメソッド(いくつかのことがあるかもしれません...)。)言われていることは、私が何かを見逃してしまったら、別のサブ質問を追加しました。
なぜcharイベントではなく、キーup/downイベントを処理していますか? –
@EricBrown私はまだ矢印キーのナビゲーションやキーボード駆動の選択などの操作を行う必要があるためです。それとも私が行方不明になっている別の方法がありますか?ちなみに、小さなフォローアップの質問で繰り返し迷惑をかけて申し訳ありません。 – andlabs