1

をフックするためにwndproc、私はaを書いてwndprochook使用しますSetWindowLong

wndproc=(WNDPROC)GetWindowLong(hwnd_1,GWL_WNDPROC);
SetWindowLong(hwnd_1,GWL_WNDPROC,(LONG)wndprochook);

今、私は関数の中で何かをしなければなりません、wndprocそして関数の終わりに、私はオリジナルを呼び出しますwndproc

return wndproc(hwnd, uMsg, wParam, lParam);

それは失敗しますが、私が見つけた神に感謝しますCallWindowProc

return CallWindowProc(wndproc, hwnd, uMsg, wParam, lParam);

今それは働いています。質問1:なぜ使用する必要があるのですか?単に電話するときに何が欠けていますか?CallWindowProcwndproc

フックは正常に機能していますが、プログラムを終了するとクラッシュします。もちろん、すべてが完了し、クラッシュは実際には何にも影響しません。しかし、クラッシュを見るのはまだ悪いことです。質問2:ここで何が起こったのか、そしてそれを修正する方法は?

元のプログラムがどのように閉じられるかについての情報がないことを残念に思います。私が行うのは、wndprocいくつかのメッセージをキャプチャするためにフックするだけだからです。ですから、これまでに同様の状況に遭遇したことのある経験豊富な人が助けてくれることを願っています。

4

3 に答える 3

2

のドキュメントからCallWindowProc:

「パラメータをまたはに設定してGetWindowLong関数を呼び出してこの値を取得する場合、実際には、ウィンドウまたはダイアログ ボックス プロシージャのアドレスか、またはのみに意味のある特別な内部値です。」nIndexGWL_WNDPROCDWL_DLGPROCCallWindowProc

「特別な内部値」を呼び出すには、呼び出しと同じことを行う必要があります。CallWindowProcこれを行う最も簡単な方法は、CalLWindowProc…を呼び出すことです。

ところで、 を見てSetWindowSubclassください。

于 2013-03-22T14:07:02.543 に答える