示例代碼運行效果圖如下:
實現程序只運行一次的方法很多,但是原理都是一樣的,就是運行第一次的時候設置一個標記,每次運行的時候檢查該標記,如果有就說明已經運行了。
具體實現:
1、在程序初始化的時候 (InitInstance()) 枚舉所有的窗口,查找本程序的實例是否存在
2、在主窗口初始化的時候在本窗口的屬性列表中添加一個標記,以便程序查找.
部分關鍵代碼
1、在App的InitInstance()中枚舉所有窗口,查找本程序實例
HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚舉所有運行的窗口
if(oldHWnd != NULL)
{
AfxMessageBox("本程序已經在運行了");
::ShowWindow(oldHWnd,SW_SHOWNORMAL); //激活找到的前一個程序
::SetForegroundWindow(oldHWnd); //把它設為前景窗口
return false; //退出本次運行
}
2、添加EnumWndProc窗口過程函數:
//添加的標識只運行一次的屬性名
CString g_szPropName = "Your Prop Name"; //自己定義一個屬性名
HANDLE g_hValue = (HANDLE)1; //自己定義一個屬性值
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
HANDLE h = GetProp(hwnd,g_szPropName);
if( h == g_hValue)
{
*(HWND*)lParam = hwnd;
return false;
}
return true;
}
3、在主窗口的 OnInitDialog()中添加屬性
//設置窗口屬性
SetProp(m_hWnd,g_szPropName,g_hValue);
本文配套源碼