none
MFC の PreTranslateMessage と同等の処理を行う方法について RRS feed

  • 質問

  • MFCを使用しないプロジェクトで IME が処理する前にキーイベントを処理しようとしています。

    CreateWindow関数のコールバック関数(WndProc)でキーイベントを処理しようとしましたが、すでに IME がキーイベントを受け取っており、変換候補文字が表示されてしまいます。

    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
     switch (msg)
     {
     .....
     case WM_KEYDOWN:
     case WM_KEYUP:
     case WM_SYSKEYDOWN:
     case WM_SYSKEYUP:
      return 1;

    上記コードのようにキーイベントを処理しないようにしても、すでに IME では変換候補文字が表示されてしまいます。

    MFCで確認したところ、以下のように、PreTranslateMessage 関数内で "return 1" を実行すると IME にはメッセージは送られないようです。

    BOOL CImeTestDlg::PreTranslateMessage(MSG* pMsg)
    {
     switch (pMsg->message )
     {
     case WM_KEYDOWN:
     case WM_KEYUP:
     case WM_SYSKEYDOWN:
     case WM_SYSKEYUP:
      // ここで必要な処理を行う
      return 1;

    MFC を使用しないプロジェクトで PreTranslateMessage と同等の処理を行う方法があればアドバイス願います。
    お手数をお掛けしますが、よろしくお願いします。


    マンモス
    2009年5月24日 13:21

回答

  • MFC はソースもあるわけですし、PreTranslateMessage 内でブレークポイント張って呼び出し元調べりゃすぐ分かると思いますが。
    PreTranslateMessage の関数名通り、メッセージループの TranslateMessage の呼び出し前に呼び出されます。
    • 回答としてマーク マンモス 2009年5月25日 15:03
    2009年5月24日 13:34

すべての返信

  • MFC はソースもあるわけですし、PreTranslateMessage 内でブレークポイント張って呼び出し元調べりゃすぐ分かると思いますが。
    PreTranslateMessage の関数名通り、メッセージループの TranslateMessage の呼び出し前に呼び出されます。
    • 回答としてマーク マンモス 2009年5月25日 15:03
    2009年5月24日 13:34
  • ご回答ありがとうございます。
    TranslateMessageを実行せずに、メッセージ処理関数内で文字コードの処理をすることで解決しました。


    マンモス
    2009年5月25日 15:10