3

HtmlHelpA winapiメソッドを呼び出して、アプリの.chmを表示しています。このメソッドはHWNDをすぐに返し、ヘルプウィンドウは別のウィンドウとして表示されます。

ウィンドウと一緒に、このhwndのタイマーを設定しました。私の問題は、タイマーを強制終了するためにこのウィンドウがいつ閉じられるかを知る必要があることです。

私の最初のアプローチはWndProcコールバックを登録しようとしましたが、ウィンドウを作成していないため、hwndへの参照しかありません。

次に、フック(SetWindowsHookEx)を試してみましたが、HOOKPROCはHWNDをパラメーターとしてコールバックに持ち込みません。その上、私はこのhwndのスレッドを知る必要があります。

HWNDが閉じられたとき、またはWndProcにWM_CLOSEメッセージを待機させるときにコールバックを登録する方法はありますか?

4

2 に答える 2

2

必要に応じて、既存のウィンドウに新しいウィンドウプロシージャを登録できます。のドキュメントを確認してくださいSetWindowLongPtr()

このように呼び出す:

SetWindowLongPtr(hwnd, GWLP_WNDPROC, &MyCustomHelpWindowProc);

ウィンドウのサブクラス化は非常にデリケートであることを覚えておいてください。DefWindowProc()興味のないメッセージではなく、古いウィンドウプロシージャをどこかに保存して、それを呼び出すことをお勧めします。

于 2011-12-14T18:35:47.240 に答える
1

ヘルプ ウィンドウをサブクラス化したい。サブクラス化すると、ウィンドウ プロシージャに送られるすべてのメッセージをスパイする機会が得られます。関心のあるメッセージが表示されたら、必要な追加作業を行ってから、通常の処理のためにメッセージを元のウィンドウ プロシージャに渡します。

LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);

WNDPROC fnOldProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(hwndHelp, GWLP_WNDPROC, &MyWndProc));


LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    if (msg == WM_CLOSE) {
        // Kill your timer here.
    }
    return CallWindowProc(fnOldProc, hwnd, msg, wp, lp);
}
于 2011-12-14T18:57:03.387 に答える