MFC單例運行三種方式

MFC單例運行三種方式
1、查找窗口句柄是否存在
2、互斥
3、註冊表

要使應用程序只允許同時運行一個實例,可以這樣做:在XXXApp::InitInstance() 函數裏面開頭部位添加代碼。
代碼方案1:(直接查找該程序窗口是否已經存在)
CWnd *pWndPrev, *pWndChild;
if(pWndPrev=CWnd::FindWindow("#32770","DMTOOL")  )    //見說明1
{
   if(pWndPrev->IsIconic())
   {
    pWndPrev->ShowWindow(SW_RESTORE);
    pWndPrev->SetForegroundWindow();
   }
   else
   {
    pWndChild=pWndPrev->GetLastActivePopup();
    pWndChild->SetForegroundWindow();
   }
   return FALSE;
}
代碼方案2:(使用互斥變量來判斷)
HANDLE hMutex=CreateMutex(NULL,TRUE,"DMTOOL");
if(hMutex)
{
   if(ERROR_ALREADY_EXISTS==GetLastError())
   {
    AfxMessageBox("程序已在運行中!");
    return FALSE;
   }
}
這裏有幾點說明: 1、FindWindow函數。函數第一個參數是窗口的類名,第二個參數是窗口標題。 窗口類名如何獲得?使用SPY++裏的查找功能,找到你所要看的窗口, 窗口屬性裏面有一項就是類名,例如這裏的“#32770”。 2、GetLastActivePopup  函數功能:該函數確定指定窗口中的哪一個彈出式窗口是最近活動的窗口。  函數原型:HWND GetLastActivePopup(HWND hWnd);  參數:hWnd(所有者窗口句柄)。  返回值:返回值標識了最近活動的彈出式窗口的句柄。如果滿足下列任一條件, 則返回值與參數hWnd相同: 由hWnd指定的窗口是最近活動的:由hWnd指定的窗口不擁有任何彈出式窗口; 由hWnd指定的窗口不是頂層窗口或它屬於其他窗口。 3、SetForegroundWindow() 函數功能:該函數將創建指定窗口的線程設置到前臺,並且激活該窗口。 鍵盤輸入轉向該窗口,併爲用戶改各種可視的記號。系統給創建前臺窗口的線程 分配的權限稍高於其他線程。  函數原型:BOOL SetForegroundWindow(HWND hWnd)  參數: hWnd(將被激活並被調入前臺的窗口句柄)。  返回值:如果窗口設入了前臺,返回值爲非零;如果窗口未被設入前臺,返回值爲零。  備註:前臺窗口是z序頂部的窗口,是用戶的工作窗口。 在一個多任務優先搶佔環境中,應讓用戶控制前臺窗口。
代碼方案三:(註冊碼)
#define UNIQE_NAME "{1AB792D6-EAF2-3267-9A84-9135681127A4}"
#define GIS_MSG "{D48CA993-4925-41cb-8F59-ABAAAFCEF797}"

const UINT ID_GIS_INSTANCE = ::RegisterWindowMessage(GIS_MSG); //註冊消息

// 確保程序只有一個實例在運行
 m_hOneInstance = ::CreateMutex(NULL, FALSE, UNIQE_NAME);
 if (GetLastError() == ERROR_ALREADY_EXISTS )//如果存在前一個
 {
  //發送消息,激活實例
  DWORD dwRecipients = BSM_APPLICATIONS; 
  ::BroadcastSystemMessage(BSF_NOHANG, &dwRecipients,
   ID_GIS_INSTANCE, // registered window message
   0, 0);    // user defined parameters

  return FALSE;
 }

ON_REGISTERED_MESSAGE(ID_GIS_INSTANCE, OnGISInstance)
LRESULT CMainFrame::OnGISInstance(WPARAM wParam, LPARAM lParam)
{
 theApp.m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
 theApp.m_pMainWnd->SetForegroundWindow();

 ::AfxMessageBox("本程序已經有一個實例在運行了。");

 return 0;
}
發佈了59 篇原創文章 · 獲贊 27 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章