我正在调用HtmlHelpA winapi方法来显示我的应用程序的.chm。此方法立即返回HWND,帮助窗口显示为单独的窗口。
除了窗口,我为这个hwnd设置了一个计时器。我的问题是我需要知道这个窗口何时关闭以杀死计时器。
我的第一种方法是尝试注册WndProc回调,但我不能这样做,因为我没有创建窗口,我只有对hwnd的引用。
然后我尝试使用钩子(SetWindowsHookEx),但HOOKPROC不会将HWND作为参数传递回调。此外,我需要知道这个hwnd的主题。
当HWND关闭或让WndProc等待WM_CLOSE消息时,有没有办法注册回调?
答案 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);
}