应用程序只运行一个实例

方法一(MFC适用)、

BOOL CXXXApp::InitInstance()
{
	// keep only one program running
	HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);
	if (GetLastError() == ERROR_ALREADY_EXISTS)
	{
		CloseHandle(hSem);

		HWND hWndPrevious = GetWindow(::GetDesktopWindow(), GW_CHILD);
		while (IsWindow(hWndPrevious))
		{
			if (GetProp(hWndPrevious, m_pszExeName))
			{
				if (IsIconic(hWndPrevious))
				{
					ShowWindow(hWndPrevious, SW_RESTORE);
				}

				SetForegroundWindow(hWndPrevious);
				SetForegroundWindow(::GetLastActivePopup(hWndPrevious));

				return FALSE;
			}

			hWndPrevious = GetWindow(hWndPrevious, GW_HWNDNEXT);
		}

		return FALSE;
	}

    //......
}

int CXXXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialogEx::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  Add your specialized creation code here
	SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);

	return 0;
}

void CXXXDlg::OnDestroy()
{
	CDialogEx::OnDestroy();

	// TODO: Add your message handler code here
	RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);
}

方法二(MFC适用)、

BOOL CXXXApp::InitInstance()        
{
    // keep only one program running
	HANDLE hMutex = CreateMutex(NULL, FALSE, _T("unicode string"));
	if (hMutex != NULL)  
	{  
		if (GetLastError() == ERROR_ALREADY_EXISTS)  
		{  
			HWND   oldHWnd = NULL;   
			oldHWnd = FindWindow(NULL, _T("dialog title"));
			if (oldHWnd)   
			{   
				ShowWindow(oldHWnd, SW_SHOWNORMAL);
				SetActiveWindow(oldHWnd);
				BringWindowToTop(oldHWnd);
				SetForegroundWindow(oldHWnd);
			}  
			CloseHandle(hMutex);
			hMutex = NULL;

			return FALSE;  
		}  
	} 

    // ......
}


方法三(Win32程序适用)、

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hWnd = FindWindow(szWindowClass, szTitle); 
   if (hWnd) 
   {
	   // set focus to foremost child window
	   // The "| 0x00000001" is used to bring any owned windows to the foreground and
	   // activate them.
	   // SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
	   return FALSE;
   }

// ......
}

方法四(全局互斥量,在程序入口使用即可)、

#pragma data_seg("Shared")
int volatile g_lAppInstance = 0;
#pragma data_seg()
#pragma comment(linker,"/section:Shared,RWS")

if (0 == g_lAppInstance)
{
    g_lAppInstance = 1;
}
else if (1 == g_lAppInstance)
{
    MessageBox(NULL, TEXT("Already running"), TEXT("warning"), MB_OK);
    return FALSE;
}
else
{
    // start it
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值