防止C++程式重複開啟
我們有些程式是可以同時執行多個程序,典型的像Visual Studio.但有些就能一次執行一個程序.比如Outlook.那你可能會問啥時可以讓它同時開啟多個應用程式,啥時只能一個啊.這個主要看程序間是否獨立,會不會有衝突,是否會時讀寫相同的檔案.
如果你不寫程式碼去做些處理預設肯定是可以讓你同時執行多個程序的.那假如只能一次執行一個程序咋整呢?有兩種常用的方式.
使用互斥(Mutex)
在處理執行緒同步的時候我們也會用到這東東.我們知道它是一個核心物件.系統中一次只能建立一個,如果你再次建立一個同名的會出錯.我們就是利用這個原理來達到一次只執行一個程序.
在APP類中的InitInstance函式的開頭新增如下程式碼.
HANDLE hMutex;
BOOL CMyApp::InitInstance(){
hMutex = CreateMutex(NULL,FALSE,_T("ArwenApp"));
if(GetLastError() == ERROR_ALREADY_EXISTS){ //如果已經存在同名的Mutex會得到這個錯誤.
CloseHandle(hMutex);
return FALSE;
}
//其他程式碼
}
CMyApp::~CMyApp(){ //解構函式中關閉互斥控制代碼,當然如果你不寫也沒事.關閉應用程式時系統也會自動給你Close,不過還是自己寫上好點了.
CloseHandle(hMutex);
}
查詢窗體是否存在
在APP類中的InitInstance函式的開頭新增如下程式碼.
BOOL CMyApp::InitInstance(){
CWnd* pWndExist;
CWnd* pWndPopup;
pWndExist = CWnd::FindWindow(_T("ArwenAppClass"),NULL);
if(pWndExist) { //如果窗體存在說明已經打開了應用程式,下面的操作只是讓程式更人性化.也可以簡單的返回FALSE就行.
pWndPopup = pWndExist->GetLastActivePopup(); //獲得開啟的活動窗體
if(pWndPopup->IsIconic())
pWndPopup->ShowWindow(SW_RESTORE); //如果窗體被最小化了,restore它
pWndPopup->ShowWindow(SW_SHOW); //顯示已經開啟的窗體
pWndPopup->SetForegroundWindow(); //讓窗體顯示在最前面
return FALSE;
}
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(WNDCLASS));
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = LoadIcon(IDR_MAINFRAME);
wndcls.hCursor = LoadStandardCursor( IDC_ARROW );
wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = _T("ArwenAppClass"); //註冊一個窗體用來做判斷是符存在已經開啟的應用程式,除此之外該窗體沒起啥作用
if(!AfxRegisterClass(&wndcls))
{
return FALSE;
}
CreateWindow(wndcls, _T("ArwenAppClass"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);
//其他程式碼
}