相同问题,在基础,线程,Com版如题:工程类型SDI:当然,可以重载 OnOk() OnCancel(), 然后在它们里面向父窗体发个消息.
但,当前项目基本成形,如此大的改动,量大,易误.[因有众多的这种情形]理想状态,我在CView中,或CMainFrame中进行捕获它们发来的销毁消息,
而不改动派生的Dialog类.怎么处理呢? 请高手指点.
但,当前项目基本成形,如此大的改动,量大,易误.[因有众多的这种情形]理想状态,我在CView中,或CMainFrame中进行捕获它们发来的销毁消息,
而不改动派生的Dialog类.怎么处理呢? 请高手指点.
app.h
#define WM_CHILDDESTROY WM_USER+0x100
{
public:
HHOOK m_hHook;
//钩子过程
static LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam);
}app.cpp:InitInstance:
m_hHook = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,AfxGetInstanceHandle(),GetCurrentThreadId());ExitInstance:if(m_hHook != NULL)
UnhookWindowsHookEx(m_hHook);//////////////////////////////////////////////////////////////////////////
//Hook 回调函数LRESULT CALLBACK CTestListCtrlApp::CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode == HC_ACTION)
{
CWPSTRUCT * pCwp = (CWPSTRUCT*)lParam;
if(pCwp != NULL && ::IsWindow(pCwp->hwnd) )
{
if(pCwp->message == WM_DESTROY)
{
TRACE("句柄:%x\n",pCwp->hwnd); TCHAR szText[256];
TCHAR szClassName[256];
GetWindowText(pCwp->hwnd,szText,256);
TRACE("WindowText:%s\n",szText);
GetClassName(pCwp->hwnd,szClassName,256);
TRACE("ClassName:%s\n",szClassName);
//"#32770"
if(theApp.m_pMainWnd->GetSafeHwnd() != NULL && _tcsicmp(szClassName,_T("#32770")) == 0)
{
//下面是发送消息给主窗口#32770是mfc默认的dialog类名,你可以用不同的方式和不同的条件来判断,注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了
SendMessage(theApp.m_pMainWnd->GetSafeHwnd(),WM_CHILDDESTROY,0,(LPARAM)szText);
}
}
}
}
return CallNextHookEx(theApp.m_hHook,nCode,wParam,lParam);}主窗口中:
LRESULT CTestListCtrlDlg::OnChildDestroy(WPARAM wParam,LPARAM lParam)
{
CString strTemp;
strTemp.Format(_T("窗口名为%s的窗口正在被Destroy掉 "),lParam);
MessageBox(strTemp);
//在这里做你要做的东西
return 0;}
直接在dialog销毁的时候发送这个消息就可以了!楼上的解释一下:“注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了”是什么意思?
你没有看懂楼主的意思吗?
你说的这个方法他都知道,不过他的工程里面有上百个对话框一个一个改太麻烦。
“
注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了”
这句话的意思是在hook里面hook到WM_DESTROY消息这时消息里面对应的句柄时即将要被销毁的窗口句柄,如果将这个窗口句柄传给主窗口处理的话,这时可能已经不存在这个窗口了。
其中wParam==WM_DESTROY, lParam=idChildWindow;
对话框好象需要在WM_DESTROY中自已发送该消息:
::SendMessage(hParent, WM_PARENTNOTIFY, WM_DESTROY, m_id);父窗口接收到该消息后,可做相应处理。
LRESULT CALLBACK WndProc(HWND...)
{
switch(uMsg)
{
case WM_PARENTNOTIFY:
....
break;
}
}如果用MFC,方法类似。