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 回答