
如果子窗口是模式对话框,可以在子窗口关闭之后,获取子对话框中的值。如:CSubDlg subDlg;if(IDOK == subDlgDoModel()){ int n = subDlgm_nValue;}发送消息的话是这样:GetParent()->SendMessage(MESSAGE_ID, lParam, wParam); MESSAGE_ID是你的自定义消息ID或者干脆对GetParent()进行强制转换后直接调用父窗口的函数,但不推荐这样做。比如父窗口 CFatherDlg; 中有一函数 void Action(int n);((CFatherDlg)GetParent())->Action(m_nValue); // 直接调用父类的函数
1调用 GetConsoleTitle() 来保存当前的控制台窗口标题。
2调用 SetConsoleTitle() 来将控制台标题更改为一个唯一的标题。
3调用 Sleep(40),以确保已更新窗口标题。
4调用 FindWindow(NULL, uniquetitle),以获取 HWND,此调用将返回 HWND, 如果 *** 作失败,将返回 NULL。
5从步骤 1 中,若要恢复原始窗口标题检索调用 SetConsoleTitle() 的值。
应该测试结果的 HWND。例如可以测试是否返回的 HWND 对应于当前进程在 HWND 上调用 GetWindowText() 并将结果与 GetConsoleTitle() 进行比较。
示例代码
下面的函数中检索当前控制台应用程序窗口句柄 (HWND)。如果此函数成功,则返回值是控制台窗口的句柄。如果此函数失败,则返回值为 NULL。省略一些错误检查,为简洁起见。
HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024 // Buffer size for console window titles
HWND hwndFound; // This is what is returned to the caller
char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
// WindowTitle
char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
// WindowTitle
// Fetch current window title
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
// Format a "unique" NewWindowTitle
wsprintf(pszNewWindowTitle,"%d/%d",
GetTickCount(),
GetCurrentProcessId());
// Change current window title
SetConsoleTitle(pszNewWindowTitle);
// Ensure window title has been updated
Sleep(40);
// Look for NewWindowTitle
hwndFound=FindWindow(NULL, pszNewWindowTitle);
// Restore original window title
SetConsoleTitle(pszOldWindowTitle);
return(hwndFound);
}
1 在多文档多视图的MFC架构中,要想获得当前选中的CView可重写CView::OnActivateView函数,如下:
void
OnActivateView(BOOL bActivate,
CView pActivateView,
CView pDeactiveView)
{
if(bActivate)
{
SetEnable(TRUE);
}
else
{
SetEnable(FALSE);
}
CView::OnActivateView(bActivate,
pActivateView,
pDeactiveView);
}
2 获得窗口或者视图句柄
2.1 获得窗口句柄
要找到某个CWnd对象的HWND,用GetSafeHwnd()。
在窗口类中,有句柄的成员变量,可以直接访问: m_hWnd
在窗口类外,可以用AfxGetMainWnd()->m_hWnd获得。
在MainFrame里直接用this;
其它地方用 CMainFrame pMainFrame = (CMainFrame)theAppm_pMainWnd;
想得到一个控件的的句柄
GetDlgItem(ID…)->m_hWnd
2.2 获得视图的句柄
AfxGetMainWnd()->GetActiveView();
SDI: ((CFrameWnd)(AfxGetApp()->m_pMainWnd))->GetActiveView();
MDI: ((CFrameWnd)(AfxGetApp()->m_pMainWnd))->GetActiveFrame()->GetActiveView();
DWORD PID;
PID = GetProcessPID(L"testexe");
//获取进程pid函数
DWORD GetProcessPID(LPCTSTR pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)){
if (!_tcsicmp(peszExeFile, pName)) {
CloseHandle(hSnapshot);
return peth32ProcessID;
}
}
return NULL;
}
//由进程pid获取进程句柄,置顶
HWND hh = GetProcessTopWindows(PID);
HWND GetProcessTopWindows(DWORD dwPID){
count = 0;
EnumWindows((WNDENUMPROC)EnumWndProc, (LPARAM)dwPID);
if(count > 0) {
//cout << "窗口句柄是:" << nhWnd[count -1] << endl;//输出句柄,可用spy++工具核对
return (nhWnd[count -1]);
}
return NULL;
}
别忘了添加对应头文件。
WS_POPUP 表示d出窗口,不是泊位在父窗口的范围内(WS_CHILD)。MessageBox就是这个样子。
你用WS_POPUP样式,又加了父亲窗口,表示在任务栏上,将此d出窗口限制在父窗口所在位置。
而这个 pParent 为WS_CHILD窗口,没有任务栏泊位的权限,所以就转移给其祖父窗口了。
——这点我没试过,我这样理解的。
以上就是关于MFC 父窗口获取子窗口全部的内容,包括:MFC 父窗口获取子窗口、获得cmd窗口句柄、mfc中创建分割视图怎么获取视图窗口句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)