Windows 8.1(64bit)上でのマウスメッセージのグローバルフックで32bit DLLで64bitアプリケーションをフックできる

[戻る]
原田 2014/09/17(水) 05:14:42
原田と申します。よろしくお願いします。
マウスメッセージのグローバルフックでの32bit・64bitの扱いについての質問です。

<<<< 環境 >>>>

・Windows 8.1(64bit)
・Visual Studio Express 2013 for Windows Desktop

<<<< 作成しているソフト >>>>

マウスやキーボードのメッセージをグローバルフックで取得するプログラムを作成していま
す。
これは、マウスやキーボードの入力を視覚化するソフトを制作するためです。

<<<< 内容 >>>>

まずは、マウスメッセージをフックするプログラムを試しに作成しました。
グローバルフックでは、フックプロシジャはDLL内に置かなければならないとのこと。
そこで、フック登録・フック解除・フックプロシジャの関数を含むDLLを作成しました。

DLL内のフックプロシジャでは、マウスメッセージの本来の送信先のウィンドウのタイトル
を"Renamed"に変更しているだけです。
つまり、マウスカーソルを乗せるとそのウィンドウのタイトルを"Renamed"に変えるというだ
けの機能です。

<<<< 32bitのみ作成 >>>>

32bitのDLLは32bitのアプリケーションケーションにしかインジェクションできず、64bitにも
対応するなら64bit版のDLLも別名で作成しなければならないと理解しています。しかし、まず
は32bit版だけを作成しました。

<<<< 現象 >>>>

作成した32bitの実行ファイルを実行しました。
もちろん、32bit版のアプリケーションのマウスメッセージしかフックできないと考えていた
のですが、実行してみると64bitのアプリケーションのウィンドウのタイトルまで "Renamed" 
に変わってしまいます。

エクスプローラー、タスクマネージャ、32ビット版Vim、32bit版Google Chromeを起動し、マ
ウスカーソルを各ウィンドウ上を通過させました。
すると、エクスプローラーも、タスクマネージャもVimもGoogle Chromeも、タイトルが 
"Renamed" になりました。

<<<< 調べてみると >>>>

MSDNの、

  http://msdn.microsoft.com/ja-jp/library/aa384274(v=vs.85).aspx

のページ( WOW64 実装の詳細 ) によると、

  『WH_MOUSE、WH_KEYBOARD、WH_JOURNAL*、WH_SHELL、および下位レベルのフックは、フック
を処理しているスレッドではなく、フックがインストールされたスレッドで呼び出すことがで
きます。これらのフックでは、フック チェインで 64 ビット フックの前に 32 ビット フッ
クがある場合に、32 ビットおよび 64 ビット フックの両方が呼び出される可能性がありま
す。』

とありました。困っているのは、

  『32 ビットおよび 64 ビット フックの両方が呼び出される可能性があります。』

の部分です。これは、

  ・Windowsの8や8.1なら32bitと64bitの両方が呼ばれるがWindows 7では両方は呼ばれない

という意味なのか、

  ・メッセージの種類によって32bitと64bitの両方が呼ばれる場合がある

という意味なのかさっぱりわかりません。

<<<< どのOSでも動くものを作るには? >>>>

  Windows XP / Vista / 7 / 8 / 8.1 のそれぞれの32bit版・64bit版で動作するものを作り
たいのですがどうすれば良いのかわかりません。

  当初の計画では、32bit版と64bit版の両方を作成し、64bit環境であれば32bit版と64bit版
の両方を起動し、プロセス間通信で情報を受け渡すという作りにしようと考えていました。

  しかし、今回のように32bit版で64bitアプリケーションのメッセージまでフックしてしまう
と、二重にフックしてしまうことになります。

  どのような作りにするのが最善か、参考になる資料などご存知でしたら教えていただけない
でしょうか。

古いスレッドには追加発言できません。