简介:
获取主对话框和子对话框的句柄,子对话框通过FindWindow。我之所以会用这个函数,其实我是有这个需求,那就是我需要在一个对话框的通过AfxBeginThread创建的线程中调用另一个对话框函数。废话少数,如下:
1.主对话框
在其它对话框或者线程调用时,目前有以下几种常用的方法
1)通过获取对话框的指针方式
CTcpAsynSDlg *pMainDlg = (CTcpAsynSDlg*)AfxGetApp()->GetMainWnd();
pMainDlg->m_hWnd; //就是指向主对话框的句柄。
2)调用GetParent()
CWnd* pWnd=this->GetParent();
pWnd->m_hWnd;可以获得父窗口句柄。
3)调用AfxGetMainWnd()
AfxGetMainWnd()-> m_hWnd;
AfxGetMainWnd(); 返回的是m_pMainWnd
2.子对话框
1)使用FindWindow()
CLogReadDlg* g_pLogReadDlgWnd;
HWND hWnd = ::FindWindow(NULL,"日志");
//HWND hWnd = ::FindWindow("#32770","日志");
g_pLogReadDlgWnd = (CLogReadDlg*)FromHandle(hWnd);
顺便通过FromHandle还可以获得对话框指针。
2)详解
MSDN:
HWND FindWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName );
很多人误以为第一个参数是类名之类的,其实是错误的,不要被变量名迷惑。
通过VC工具Spy++,如图可以看到使用方法。所有的对话框窗口类名都是#32770。
所以也可以调用HWND hWnd = ::FindWindow("#32770","日志");
但是这种不直观,最简单的方法是HWND hWnd = ::FindWindow(NULL,"日志");第二个参数就是你的窗口名,简单的理解就是对话框的标题。
3)注意
很多人对FindWindow()第一个参数没有完全理解,建议使用HWND hWnd = ::FindWindow(NULL,"日志");
把第二个参数替换成你们自己的标题名即可。