从HWND引用中关闭回调或WM_CLOSE
Close callback or WM_CLOSE from a HWND reference
我正在调用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);
}
相关文章:
- ofstream::close() 是否在 Linux 上调用同步?
- 如果我在字符数组上使用 close() 会发生什么?
- "WM" C++是什么意思?
- ZeroMQ 在 context.close() 中被阻止.如何在C++中安全地关闭套接字和上下文?
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- inData.open and inData.close in C++
- 为什么 QQuickWindow->close() 不从 rootObjects 中删除对象?
- 请求X11在C或C++中合成WM的图像
- 如何在OS X上阻止QProgressDialog的'native close button'?
- 对ifstream对象调用close时出现分段错误
- 关闭文件流时出错,其存在取决于与 C++ 中的 .close() 语句相同的布尔值
- QSqlDriver::close使应用程序崩溃
- 确保QSerialPort.close在程序执行完成之前完成
- Qt窗口不会使用其他类的"this->close()"关闭
- 为什么boost shared_ptr包含带有close()的标头
- close和_close,read和_read,write和_write——有什么区别
- 在我的Linux中调用了哪个版本的close(),来自posix lib或内核
- close() 和 closesocket() 可互换
- QFile::flush() vs QFile::close()
- To ::close() or to ::fclose()?