• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SetWindowsHookExで質問)

SetWindowsHookExで質問

このQ&Aのポイント
  • WindowsAPIの質問です。hHook = SetWindowsHookEx( WH_CALLWNDPROCERET , (HOOKPROC)CallWndRetProc , hInstance , 0 )といった形で利用しています。
  • CallWndRetProc関数には、nCodeパラメータの値に応じて処理を行います。nCodeが0以上の場合は、CallNextHookEx関数を呼び出し、その戻り値を返すことが推奨されています。
  • しかし、nCodeが0の場合にCallNextHookEx関数を呼び出すと、例外エラーが発生し、Windowsが不安定になることがあります。そのため、nCodeがHC_ACTION(0以上)の場合は、return 0;とすることで問題を回避することができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.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

sha-girl
質問者

お礼

丁寧にご回答下さり有難うございます。 MSDN読み直しました。 ご指摘の通り hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , NULL, GetCurrentThreadId() ); としたところ解決しました。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

グローバルフックのようですが、CallWndRetProc()、DLLの中ですか? http://okweb.jp/kotaeru.php3?q=1343498 ってことでの確認でしたらローカルフックでもかまわないかと。

sha-girl
質問者

お礼

いつもご回答有難うございます。m(_ _)m 前回の質問とは関係なくWH_CALLWNDPROCRETを実験的に使っています。 DLL内部ではありません。 WndProcと同じcppファイルに書いてます。 つまりhInsttance はWinMainのHINSTANCE。 ひょっとして使い方間違ってるでしょうか・・・ 「ローカルフック」とは同じインスタンス内に SetWindowsHookExを使うものと解釈しています。

関連するQ&A