工控编程吧

标题: 上位机MFC如何将应用程序已运行的实例调至前台 [打印本页]

作者: qq263946146    时间: 2019-8-12 10:31
标题: 上位机MFC如何将应用程序已运行的实例调至前台
上一例程我们介绍可以使用函数CreateMutex创建互斥对象。
创建失败就表示已有实例在运行。
在知道有实例在运行,我们就可以结果GetDesktopWindow,GetWindow,GetProp
找到实例的标识,进而 发送消息给实例窗口,将其显示在最前面,发送一些额外消息。

  1. BOOL CDemoApp::InitInstance()
  2. {
  3.         //创建互斥量
  4.         m_hMutex = ::CreateMutex(NULL, FALSE, _T("DemoApp"));

  5.         //判断互斥量是否存在
  6.         if (GetLastError() == ERROR_ALREADY_EXISTS)       
  7.         {
  8.                 //获得桌面窗口
  9.                 CWnd* pDesktopWnd = CWnd::GetDesktopWindow();

  10.                 //获得第一个子窗口
  11.                 CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);

  12.                 while (pWnd != NULL)
  13.                 {
  14.                         //获得窗口标志
  15.                         if (::GetProp(pWnd->m_hWnd, m_pszExeName))
  16.                         {       
  17.                                 //激活窗口
  18.                                 pWnd->SetForegroundWindow();

  19.                                 pWnd->SetDlgItemText(IDC_TEXT, _T("应用程序已经运行。"));

  20.                                 return FALSE;
  21.                         }

  22.                         // 继续寻找下一个窗口
  23.                         pWnd = pWnd->GetWindow(GW_HWNDNEXT);
  24.                 }

  25.                 return FALSE;       
  26.         }
  27. }
复制代码
记得程序退出时,清楚变量。
  1. int CDemoApp::ExitInstance()
  2. {
  3.         if (m_hMutex != NULL)
  4.         {
  5.                 //关闭句柄
  6.                 CloseHandle(m_hMutex);
  7.         }

  8.         return CWinApp::ExitInstance();
  9. }
复制代码







欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4