プロが教えるわが家の防犯対策術!

WindowsAPIの質問です。
hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , hInsttance , 0 )
といった形で利用しています。
(hInsttance は自分自身。)

CallWndRetProcですがMSDNでは
nCode パラメータの値が 0 未満の場合、CallNextHookEx 関数を呼び出し、
nCode パラメータの値が 0 以上の場合も、CallNextHookEx 関数を呼び出し、その関数の戻り値を返すことを強く推奨します。
CallNextHookEx 関数を呼び出さない場合、0 を返すべきです。
http://www.microsoft.com/japan/msdn/library/defa …

となっています。
しかし nCode == 0のとき、すなわちnCode == HC_ACTIONで
CallNextHookExを呼び出すと、例外エラーがでた末、Windows自体が不安定になってしまいます。
nCode == HC_ACTIONのとき、return 0;にすれば問題はでないのですが
なんだか気分的にスッキリしません。

ちなみに英語のドキュメントも読みましたがgreater than or equal to Zero
となっており0を含むようでした。


LRESULT CALLBACK CallWndRetProc(
int nCode,
WPARAM wParam,
LPARAM lParam ){

return CallNextHookEx( hHook, nCode , wParam , lParam );
}
こんな感じで書くと強制終了してWindowsが不安定になってしまいます。

A 回答 (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/defa …
    • good
    • 0
この回答へのお礼

丁寧にご回答下さり有難うございます。

MSDN読み直しました。
ご指摘の通り
hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , NULL, GetCurrentThreadId() );
としたところ解決しました。

お礼日時:2005/04/21 23:16

グローバルフックのようですが、CallWndRetProc()、DLLの中ですか?



http://okweb.jp/kotaeru.php3?q=1343498
ってことでの確認でしたらローカルフックでもかまわないかと。
    • good
    • 0
この回答へのお礼

いつもご回答有難うございます。m(_ _)m
前回の質問とは関係なくWH_CALLWNDPROCRETを実験的に使っています。
DLL内部ではありません。
WndProcと同じcppファイルに書いてます。
つまりhInsttance はWinMainのHINSTANCE。

ひょっとして使い方間違ってるでしょうか・・・
「ローカルフック」とは同じインスタンス内に
SetWindowsHookExを使うものと解釈しています。

お礼日時:2005/04/21 17:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!