MFC 父窗口获取子窗口

MFC 父窗口获取子窗口,第1张

如果子窗口是模式对话框,可以在子窗口关闭之后,获取子对话框中的值。如: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中创建分割视图怎么获取视图窗口句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9680123.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存