程序Dialog主窗口被隐藏后,如何再显示出来

zhouxiangbai 2011-12-02 06:43:30
1. MFC,基于对话框程序,Dialog主窗口调用ShowWindow(SW_HIDE),把自己隐藏
2. Dialog没有title

想实现的功能:为确保同一时刻,只运行一个程序,需要在程序启动过程中,检查当前该程序是否已经运行了,若是,则显示该程序。

做了些尝试都没成功:
首先,用FindWindow是无法实现的,因为Dialog没有titile。
其次,根据程序名,查找该进程的ID,再根据进程ID,获取进程的窗口句柄。可用EnumWindow或者GetTopWindos来枚举窗口。实验结果都不行,因为EnumWindow或者GetTopWindos枚举的是top-level窗口,隐藏的窗口不是它枚举的范围。

请问该如何实现?谢谢

...全文
353 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouxiangbai 2011-12-03
  • 打赏
  • 举报
回复
发现,经常来水木灌灌水,还是很有好处的,能学到很多东西。呵呵
zhouxiangbai 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cashey1991 的回复:]
刚才没看懂楼主意思,你是想检查程序是否已经有一个实例,如果有实例你还想找到那个窗口。
这里有一个实现办法,使用Mutex检查实例是否存在
查找窗口的话,你只能用SetProp函数去设置一个字符串去标记一个窗口,注意在窗口创建时调用

BOOL SetProp(
HWND hWnd, // handle to window
LPCTSTR lpString, // atom or……
[/Quote]

SetProp这个函数我从来都没见过、用过,原来还有这样的函数存在,呵呵。长见识了,非常感谢。
按照你的思路,做个了测试程序,可以实现我要的功能了。
结贴了!
开水 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;
}
开水 2011-12-02
  • 打赏
  • 举报
回复
这个关键是要一个主窗口句柄嘛,使用AfxGetMainWnd()这个函数就可以了。
CMyMainDlg *pMMD = (CMyMainDlg*)AfxGetMainWnd();

然后就是
pMMD.ShowWindow(SW_SHOW);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧