SetWindowsHookExで質問
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/default.asp?url=/japan/msdn/library/ja/jpipc/html/_win32_callwndretproc.asp
となっています。
しかし 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が不安定になってしまいます。
お礼
すみません。 GetWindow関数を使うようにしました。
補足
私も似たようなことを考えたのですがちょっときつそうだと思います。 IsChildという関数で親子関係を調べる。 というのをですが、一番下の階層(例えば15ぐらい)まで行った後に上らへんの階層(2ぐらい)にいったとき親子関係がよくわからなくなると思うのですが・・・ この場合はルートも保存していけばいけるとは思うのですが、もっといい方法がないのかと考えています。