+ -
当前位置:首页 → 问答吧 → 程序Dialog主窗口被隐藏后,如何再显示出来

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

时间:2011-12-02

来源:互联网

1. MFC,基于对话框程序,Dialog主窗口调用ShowWindow(SW_HIDE),把自己隐藏
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);

作者: 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;
  }

作者: Cashey1991   发布时间: 2011-12-02