C++ 从HWND引用关闭回调或WM_关闭
我正在调用HtmlHelpA winapi方法来显示我的应用程序的.chm。此方法立即返回HWND,帮助窗口显示为单独的窗口 随着窗口,我为这个hwnd设置了一个计时器。我的问题是,我需要知道这个窗口何时关闭以终止计时器 我的第一种方法是尝试注册WndProc回调,但我无法注册,因为我没有创建窗口,我只有一个对hwnd的引用 然后我尝试使用一个钩子(SetWindowsHookEx),但是HOOKPROC不会将HWND作为参数带到回调中。此外,我需要知道这个hwnd的线程C++ 从HWND引用关闭回调或WM_关闭,c++,windows,winapi,wndproc,hwnd,C++,Windows,Winapi,Wndproc,Hwnd,我正在调用HtmlHelpA winapi方法来显示我的应用程序的.chm。此方法立即返回HWND,帮助窗口显示为单独的窗口 随着窗口,我为这个hwnd设置了一个计时器。我的问题是,我需要知道这个窗口何时关闭以终止计时器 我的第一种方法是尝试注册WndProc回调,但我无法注册,因为我没有创建窗口,我只有一个对hwnd的引用 然后我尝试使用一个钩子(SetWindowsHookEx),但是HOOKPROC不会将HWND作为参数带到回调中。此外,我需要知道这个hwnd的线程 当HWND关闭或Wnd
当HWND关闭或WndProc等待WM_CLOSE消息时,有没有办法注册回调?如果需要,您可以为现有窗口注册新的窗口过程。查看上的文档 这样调用它:
SetWindowLongPtr(hwnd, GWLP_WNDPROC, &MyCustomHelpWindowProc);
请记住,窗口子类化非常微妙。您可能希望将旧的窗口过程存储在某个位置,并对您不感兴趣的消息调用该过程,而不是调用
DefWindowProc()
。您希望对帮助窗口进行子类化。子类化使您有机会监视所有发送到windowproc的消息。当您看到感兴趣的消息时,您需要做任何额外的工作,然后将消息传递给原始窗口过程进行正常处理
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);
}
LRESULT回调MyWndProc(HWND-HWND,UINT-msg,WPARAM-wp,LPARAM-lp);
WNDPROC fnOldProc=reinterpret_cast(::SetWindowLongPtr(hwndHelp、GWLP_WNDPROC和MyWndProc));
LRESULT回调MyWndProc(HWND HWND、UINT msg、WPARAM wp、LPARAM lp){
如果(msg==WM\u关闭){
//在这里停止计时。
}
返回CallWindowProc(fnOldProc、hwnd、msg、wp、lp);
}
这没那么容易。您正在修改的窗口属于hh.exe进程,而不是您自己的,因此您为该窗口存储的代码地址无效。谢谢!使用全局映射保存每个hwnd的旧WndProc,我已经能够从我的WndProc调用前WndProc,以某种“继承”方式检查WM关闭@RobKennedy:My help(通过VB6中内置的帮助处理和HtmlHelpA
函数)正在处理中。只有在从资源管理器启动时,它们才使用自己的hh.exe主机。确切地说,这就是我一直在调用现有WindowProc的原因。我从Rob的评论中看到,该窗口属于另一个进程,因此子类化不起作用。