2009-04-20 5 views
2

RegisterClassExWCreateWindowExWを使用してウィンドウを作成する関数をエクスポートするDLLを作成しました。すべてのメッセージは、ユニコードウィンドウでの非ユニコードWM_CHAR

GetMessageW(&msg, wnd_handle, 0, 0); 
TranslateMessage(&msg); 
DispatchMessageW(&msg); 

によって取得されます。また、DLLをロードして関数を呼び出すプログラムがあります。

Unicodeのウィンドウ作成方法にもかかわらず、WM_CHARメッセージのwParamには、ASCII以外の記号を入力するかAlt +(コード)を使用しても常にASCII文字が含まれます。 UTF-16の代わりに、wParamには、 'A'と 'z'の間にASCII文字が含まれています。 WndProcは、DLL内の静的関数です。

すべてのウィンドウ関連のコードが1つのプログラム内にある場合、問題は発生しません。

DLLのウィンドウ内にユニコードWM_CHARのメッセージが常にあるのですか?

答えて

4

問題がメッセージ検索プロセスにありました。私はGetMessage()を、代わりにGetMessageW(&msg, 0, 0, 0)GetMessageW(&msg, wnd_handle, 0, 0)の0の代わりに、私のウィンドウのハンドルに使用しました。
このように、WM_INPUTLANGCHANGEREQUESTメッセージは飲み込まれ、ロケールは英語のままでした。

0

私は100%確実ではないけど、それが役立つかもしれない:

を使用すると、DLL関数を呼び出すコードを実装するプロジェクトの設定に見てみましょう。文字セットもUnicodeで、マルチバイトではないことを確認してください。

(Project Propertiesに移動し、Generalセクションに移動し、Character SetオプションをUse Unicode Character Setに設定してください)。私はあなたがVisual Studio 2003以降を使用していると仮定していました。

+0

設定はUnicodeに設定されています。 _UNICODEプリプロセッサディレクティブも設定されています。 – mrshpot

2

あなたのアプローチはうまくいくはずです。

ワイドバージョンの代わりにANSI DefWindowProcを呼び出す可能性はありますか?それはWM_UNICHARをANSI WM_CHARメッセージに変換します。多分それはあなたが見ているものを説明するでしょう。

実験として、私はWM_UNICHARメッセージを直接処理し、その時点でデータがどのように見えるかを確認します。

+1

私はWM_UNICHARの処理に問題がありましたが、少しの検索の結果、私は「要約すると:これはドキュメントのエラーです.WindowsではWM_UNICHARは生成されません」と推測したように、 TranslateMessageによって投稿されたことについては、どのバージョンのWindowsでも真実ではありませんでした。 - https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/d455e846-d18b-4086-98de-822658bcebf0/wmunichar?forum=windowsgeneraldevelopmentissues –

関連する問題