none
グローバルフックDLLでIME関連のメッセージを取得できない

    質問

  • グローバルフックを利用して、IME関連のメッセージ(WM_IME_SETCONTEXT, WM_IME_NOTIFYなど)を取得しようとしていますが検知できませんのでご教示願います。

    現在、TightVNC(Version 2.8.5)でデスクトップ共有を行っている場合、リモート側のキー入力を、ローカル同様に処理できるように日本語対応しています。

    そこで、リモート側(TightVNCサーバー側)のIMEの状態を随時把握するため、既に実装されているグローバルフックに、SetWindowsHookEx関数でWH_CALLWNDPROCタイプをフックするように追加しました。

    WH_CALLWNDPROCで対象としている他のメッセージは取得できていますので、追加したフック自体は動作しているようですが、IME関連のメッセージが発生しません。

    試しに、テスト用のプロジェクトを作成し、同じ要領でグローバルフックを実装したところ、同じコンピューターでIME関連のメッセージも正常に取得できますので、TightVNCサーバーのフックのみIMEのメッセージが発生しないようです。

    TightVNCサーバーのIMEが無効になっているのが原因ではないかと考え、WINNLSEnableIME関数で有効にしてみましたが改善しません。
    ※テスト用のプロジェクトで確認したところ、フックをコールする側のIMEを無効にしてもメッセージは発生するようです。

    何か原因と考えられることがありましたらアドバイス願います。

    以上、よろしくお願いします。


    マンモス

    2017年9月29日 23:49

すべての返信

  • WM_IME_SETCONTEXT, WM_IME_NOTIFY等のメッセージはInput Method Manager(いわゆるIMM32)で扱われているものですが、それとは別にWindows XPよりTSF; Text Services Frameworkが導入されています。TSFを用いてかな漢字変換を行った場合、IMM32は使用されないためこれらのメッセージも送信されることはありません。
    2017年9月30日 3:21
  • 情報ありがとうございます。

    TightVNCのソースを確認し、TSFの利用に必要なオブジェクトを作成しているか調べてみましたが特に見当たりませんでした。
    念のため、TSFのメッセージをフックして、TSFが使われているかどうか検証しようと考えていますが、TSFのフック方法に関する情報が見つかりません。
    もし、TSFメッセージのフック方法をご存知でしたらご教示願います。

    以上、よろしくお願いします。


    マンモス

    2017年10月2日 8:27
  • 念のための確認です。

    TightVNC でリモート先で変換を行う IME はリモート先ですよね?
    そして、そのリモート先の IME の振る舞いをフックしようとされているのですよね?
    その、グローバルフックを仕掛けるプロセスはリモート先で実行されているという理解で合っていますか?

    // TightVNC のソースを確認して TSF の使用有無を確認された経緯がよくわからなかったため。
    // また、TSF は基本的にウィンドウメッセージでのやりとりはないに等しいので、フックで TSF 利用か否かを識別するというアプローチが何か考え違いしているような気もします。
    2017年10月2日 15:29
    モデレータ
  • お世話になっております。

    はい。その理解で合っております。
    TightVNCで変換するIMEはリモート先です。
    リモート側(TightVNCサーバー側)のグローバルフックでIMEメッセージを取得しようとしています。

    TSFを利用することで、IMEメッセージが発生しないのであれば、IMEメッセージをトリガにビューアー側(操作される側)とやり取りをするのではなく、TSFをトリガにできないかと考えていました。

    例えばリモート側で「半角/全角」キーを押すとIMEメッセージが発生し、入力モードが変更されます。
    TSF利用によりIMEメッセージが発生しないのであれば、このIMEメッセージに相当するTSF情報をウィンドウメッセージ、もしくは他の方法で取得できないかと考えていました。

    もう少し試してみます。


    マンモス

    2017年10月2日 23:57