- ベストアンサー
SetWindowsHookExで質問
- WindowsAPIの質問です。hHook = SetWindowsHookEx( WH_CALLWNDPROCERET , (HOOKPROC)CallWndRetProc , hInstance , 0 )といった形で利用しています。
- CallWndRetProc関数には、nCodeパラメータの値に応じて処理を行います。nCodeが0以上の場合は、CallNextHookEx関数を呼び出し、その戻り値を返すことが推奨されています。
- しかし、nCodeが0の場合にCallNextHookEx関数を呼び出すと、例外エラーが発生し、Windowsが不安定になることがあります。そのため、nCodeがHC_ACTION(0以上)の場合は、return 0;とすることで問題を回避することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>ひょっとして使い方間違ってるでしょうか・・・ はい、間違ってます。 >「ローカルフック」とは同じインスタンス内に >SetWindowsHookExを使うものと解釈しています。 ここはあってますが、 >hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , hInsttance , 0 ) hInsttanceがNULLでなく、かつ最後の引数でスレッドIDを指定していないのでグローバルフックになっています。 なんで、DLLにフックプロシージャをおかないと何が起こるかわかりません。 同一スレッドが対象ならインスタンスハンドルはNULL、スレッドIDはGetCurrentThreadId()の戻り値を渡せばOKです。 MSDNライブラリ、読み直してくださいね。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpipc/html/_win32_setwindowshookex.asp
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
グローバルフックのようですが、CallWndRetProc()、DLLの中ですか? http://okweb.jp/kotaeru.php3?q=1343498 ってことでの確認でしたらローカルフックでもかまわないかと。
お礼
いつもご回答有難うございます。m(_ _)m 前回の質問とは関係なくWH_CALLWNDPROCRETを実験的に使っています。 DLL内部ではありません。 WndProcと同じcppファイルに書いてます。 つまりhInsttance はWinMainのHINSTANCE。 ひょっとして使い方間違ってるでしょうか・・・ 「ローカルフック」とは同じインスタンス内に SetWindowsHookExを使うものと解釈しています。
お礼
丁寧にご回答下さり有難うございます。 MSDN読み直しました。 ご指摘の通り hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , NULL, GetCurrentThreadId() ); としたところ解決しました。