程序Dialog主窗口被隐藏后,如何再显示出来
时间:2011-12-02
来源:互联网
1. MFC,基于对话框程序,Dialog主窗口调用ShowWindow(SW_HIDE),把自己隐藏
2. Dialog没有title
想实现的功能:为确保同一时刻,只运行一个程序,需要在程序启动过程中,检查当前该程序是否已经运行了,若是,则显示该程序。
做了些尝试都没成功:
首先,用FindWindow是无法实现的,因为Dialog没有titile。
其次,根据程序名,查找该进程的ID,再根据进程ID,获取进程的窗口句柄。可用EnumWindow或者GetTopWindos来枚举窗口。实验结果都不行,因为EnumWindow或者GetTopWindos枚举的是top-level窗口,隐藏的窗口不是它枚举的范围。
请问该如何实现?谢谢
2. Dialog没有title
想实现的功能:为确保同一时刻,只运行一个程序,需要在程序启动过程中,检查当前该程序是否已经运行了,若是,则显示该程序。
做了些尝试都没成功:
首先,用FindWindow是无法实现的,因为Dialog没有titile。
其次,根据程序名,查找该进程的ID,再根据进程ID,获取进程的窗口句柄。可用EnumWindow或者GetTopWindos来枚举窗口。实验结果都不行,因为EnumWindow或者GetTopWindos枚举的是top-level窗口,隐藏的窗口不是它枚举的范围。
请问该如何实现?谢谢
作者: zhouxiangbai 发布时间: 2011-12-02
这个关键是要一个主窗口句柄嘛,使用AfxGetMainWnd()这个函数就可以了。
CMyMainDlg *pMMD = (CMyMainDlg*)AfxGetMainWnd();
然后就是
pMMD.ShowWindow(SW_SHOW);
CMyMainDlg *pMMD = (CMyMainDlg*)AfxGetMainWnd();
然后就是
pMMD.ShowWindow(SW_SHOW);
作者: Cashey1991 发布时间: 2011-12-02
刚才没看懂楼主意思,你是想检查程序是否已经有一个实例,如果有实例你还想找到那个窗口。
这里有一个实现办法,使用Mutex检查实例是否存在
查找窗口的话,你只能用SetProp函数去设置一个字符串去标记一个窗口,注意在窗口创建时调用
BOOL SetProp(
HWND hWnd, // handle to window
LPCTSTR lpString, // atom or string -- > 这里设置为 m_pszExeName 自定义变量
HANDLE hData // handle to data
);
下一个实例然后这样处理:
BOOL CDemoApp::InitInstance()
{
//创建互斥量
m_hMutex = ::CreateMutex(NULL, FALSE, _T("DemoApp"));
//判断互斥量是否存在
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
//获得桌面窗口
CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
//获得第一个子窗口
CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
while (pWnd != NULL)
{
//获得窗口标志
if (::GetProp(pWnd->m_hWnd, m_pszExeName))
{
//激活窗口
pWnd->SetForegroundWindow();
pWnd->SetDlgItemText(IDC_TEXT, _T("应用程序已经运行。"));
return FALSE;
}
// 继续寻找下一个窗口
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
return FALSE;
}
这里有一个实现办法,使用Mutex检查实例是否存在
查找窗口的话,你只能用SetProp函数去设置一个字符串去标记一个窗口,注意在窗口创建时调用
BOOL SetProp(
HWND hWnd, // handle to window
LPCTSTR lpString, // atom or string -- > 这里设置为 m_pszExeName 自定义变量
HANDLE hData // handle to data
);
下一个实例然后这样处理:
BOOL CDemoApp::InitInstance()
{
//创建互斥量
m_hMutex = ::CreateMutex(NULL, FALSE, _T("DemoApp"));
//判断互斥量是否存在
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
//获得桌面窗口
CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
//获得第一个子窗口
CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
while (pWnd != NULL)
{
//获得窗口标志
if (::GetProp(pWnd->m_hWnd, m_pszExeName))
{
//激活窗口
pWnd->SetForegroundWindow();
pWnd->SetDlgItemText(IDC_TEXT, _T("应用程序已经运行。"));
return FALSE;
}
// 继续寻找下一个窗口
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
return FALSE;
}
作者: Cashey1991 发布时间: 2011-12-02
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28