- PR -

システムフックについて教えてください。

1
投稿者投稿内容
ぶぶ
会議室デビュー日: 2006/06/27
投稿数: 5
投稿日時: 2006-06-30 10:21
こんにちは。

システムフックをDLLで作成したのですがうまくいきません。
ローカルフックとしてEXEで作成したときは動いたのですが・・・。
フックタイプ、フックプロシージャは問題がないので、
あとはハンドルかスレッド識別子だとおもうのですが、
以下のソースではだめなのでしょうか?
どなたかわかる方がいたら教えてください。


m_hHook = ::SetWindowsHookEx( WH_KEYBOARD,
 (HOOKPROC)CKeyboardHook::KeyboardProc,
(HINSTANCE)AfxGetResourceHandle,
AfxGetApp()->m_nThreadID );


環境
OS:XP
Visual Studio 2003 .NetFramework 1.1
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-06-30 12:46
もう忘れかけてて自信ありませんが。
ヘルプを見ましたか?
インスタンスハンドルはグローバル変数でないといけないし、スレッドID には 0 を指定しないといけませんよ。

#インスタンスハンドルは AfxGetResourceHandle() で良いかも
_________________
囚人のジレンマな日々
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2006-06-30 13:21
とっちゃんです。

グローバルフックする場合は、フックDLLではMFCを使わないようにしないと
誤動作することがあります(別バージョンがロードされていることがあるため)。
その他にも二次配布可能なDLL(.NET Frameworkを含む)は利用しないようにしないと
環境によっては、悲惨なことになります。

あとは、スレッドIDを0(グローバル指定)にするとか
フックプロシージャ間で共有するメモリーは共有エリアに置く
ということくらいかな?

このあたりはヘルプにも出てると思います(英語しかないかもしれませんが)。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
ぶぶ
会議室デビュー日: 2006/06/27
投稿数: 5
投稿日時: 2006-06-30 13:25
囚人さん、回答ありがとうございます。

スレッドIDを0にして試してみましたがダメでした。
ハンドルは g_hInstance global を取得しているようなので問題ないとおもうのですが。
ぶぶ
会議室デビュー日: 2006/06/27
投稿数: 5
投稿日時: 2006-06-30 13:41
第3引数を
 (HINSTANCE)AfxGetResourceHandle
  ↓
 AfxGetResourceHandle()

で解決しました。
単純なミスでした。

みなさまご協力ありがとうございました。
今後ともよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)