如何让vc只运行一个实例,禁止运行程序的多个实例?
Date: 2008-11-19 11:51:39
Category: MFC | Source: input8.com
在MFC中,让vc程序在同一时间内,只允许运行一个实例,禁止运行程序的多个实例。
下面的步骤描述如何让VC程序中在同一时间内,只运行一个实例。当第二次运行时,向最先运行的程序发送消息,使其窗口在最小化或其它状态恢复到正常显示。
下面假设你的工程名为:XXX
在stdafx.h 文件最后添加
extern UINT WM_WKSTLOCK;
打开XXX.cpp,
在CXXXApp theApp;后面添加
UINT WM_WKSTLOCK = RegisterWindowMessage(_T("Input8OnlyOne"));
在BOOL CXXXApp::InitInstance() 中找到
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
在这个前面添加
HANDLE Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, "Input8OneInstanceAllowed");
if (Mutex == NULL)
{
Mutex = CreateMutex(NULL, true, "Input8OneInstanceAllowed");
}
else
{
SendMessage(HWND_BROADCAST, WM_WKSTLOCK, 0, 0);
return FALSE;
}
在最后的 return FALSE; 前面添加
ReleaseMutex(Mutex);
如果不需要在点第二次时把前面已经运行的程序恢复(如果已经最小化的),那么到这里就可以了。
否则继续:
在 XXXDlg.h 的 DECLARE_MESSAGE_MAP() 前面加上一行
afx_msg LRESULT OnWkstLocked(WPARAM wParam, LPARAM lParam);
在 XXXDlg.cpp 的 BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)下面添加一行
ON_REGISTERED_MESSAGE(WM_WKSTLOCK, OnWkstLocked)
然后添加
LRESULT CXXXDlg::OnWkstLocked(WPARAM wParam, LPARAM lParam)
{
ShowWindow(SW_RESTORE);
return 0;
}
完成。运行一下看看效果:运行程序,然后最小化,再一次运行程序,前面最小化的是不是恢复了:)
Powered By Pig&Fish 1.0 CopyRight 2008, Input8's Blog