从HWND引用中关闭回调或WM_CLOSE

Close callback or WM_CLOSE from a HWND reference

本文关键字:WM CLOSE 回调 HWND 引用      更新时间:2023-10-16

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

与窗口一起,我设置了一个计时器。我的问题是,我需要知道这个窗口何时关闭以终止计时器。

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

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

是否有办法注册回调当HWND被关闭或有一个WndProc等待WM_CLOSE消息?

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

像这样调用:

SetWindowLongPtr(hwnd, GWLP_WNDPROC, &MyCustomHelpWindowProc);

请记住,窗口子类化是非常微妙的。您可能希望将旧的窗口过程存储在某个地方,并调用它而不是对您不感兴趣的消息调用DefWindowProc()

您想要子类化帮助窗口。子类化使您有机会监视进入窗口进程的所有消息。当您看到感兴趣的消息时,您可以做任何额外的工作,然后将消息传递给原始窗口过程进行正常处理。

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);
}