Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从HWND引用关闭回调或WM_关闭_C++_Windows_Winapi_Wndproc_Hwnd - Fatal编程技术网

C++ 从HWND引用关闭回调或WM_关闭

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

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

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

我的第一种方法是尝试注册WndProc回调,但我无法注册,因为我没有创建窗口,我只有一个对hwnd的引用

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


当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的评论中看到,该窗口属于另一个进程,因此子类化不起作用。