从HWND引用关闭回调或WM_CLOSE

时间:2011-12-14 18:26:52

标签: c++ windows winapi wndproc hwnd

我正在调用HtmlHelpA winapi方法来显示我的应用程序的.chm。此方法立即返回HWND,帮助窗口显示为单独的窗口。

除了窗口,我为这个hwnd设置了一个计时器。我的问题是我需要知道这个窗口何时关闭以杀死计时器。

我的第一种方法是尝试注册WndProc回调,但我不能这样做,因为我没有创建窗口,我只有对hwnd的引用。

然后我尝试使用钩子(SetWindowsHookEx),但HOOKPROC不会将HWND作为参数传递回调。此外,我需要知道这个hwnd的主题。

当HWND关闭或让WndProc等待WM_CLOSE消息时,有没有办法注册回调?

2 个答案:

答案 0 :(得分:1)

如果需要,您可以为现有窗口注册新的窗口过程。查看SetWindowLongPtr()上的文档。

像这样调用它:

SetWindowLongPtr(hwnd, GWLP_WNDPROC, &MyCustomHelpWindowProc);

请记住,窗口子类化非常精细。您可能希望将旧窗口过程存储在某处,而不是DefWindowProc()为您不感兴趣的消息调用该窗口过程。

答案 1 :(得分: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);
}