让MFC程序只运行单个实例 的简单示例

这里只是简单的建立一个MFC 程序来演示 只运行一个实例。


// 在头文件中添加类似如下代码

#define SCANSETTINGS_CLASSNAME		_T("ScanSettingsWindowClass")
#define APPMUTEX					_T("Global\\ScanSettings")

class C**App : public CWinAppEx
{
public:
	C**App();

	// Overrides
public:
	virtual BOOL InitInstance();
	virtual int ExitInstance();

private:	
	HANDLE m_hMutex;

	// Implementation
	BOOL RestrictOneInstance();

public:
	DECLARE_MESSAGE_MAP()	
};



// 在源文件中添加如下代码

BOOL C**App::RestrictOneInstance()
{
	SECURITY_DESCRIPTOR secutityDese;
	::InitializeSecurityDescriptor(&secutityDese, SECURITY_DESCRIPTOR_REVISION);
	::SetSecurityDescriptorDacl(&secutityDese,TRUE,NULL,FALSE);

	SECURITY_ATTRIBUTES securityAttr;
	securityAttr.nLength = sizeof SECURITY_ATTRIBUTES;
	securityAttr.bInheritHandle = FALSE;
	securityAttr.lpSecurityDescriptor = &secutityDese; 

	m_hMutex = ::CreateMutex(&securityAttr, FALSE, APPMUTEX);
	BOOL bLaunched = (m_hMutex != NULL && ERROR_ALREADY_EXISTS == GetLastError());

	CWnd *pWndPrev=NULL;
	CWnd *pWndChild = NULL;

	if (pWndPrev == NULL)
	{
		pWndPrev = CWnd::FindWindow(SCANSETTINGS_CLASSNAME, NULL);
	}

	if (pWndPrev != NULL)
	{
		// If so, does it have any popups?
		pWndChild = pWndPrev->GetLastActivePopup();

		// If iconic, restore the main window
		if (pWndPrev->IsIconic())
		{
			pWndPrev->ShowWindow(SW_RESTORE);
		}

		// Bring the main window or its popup to
		// the foreground
		pWndChild->SetForegroundWindow();

		return FALSE;			
	}

	return TRUE;
}

BOOL C**App::InitInstance()
{
	// Begin.  把这段代码加在最前面即可
	if (!RestrictOneInstance())
	{
		return FALSE;
	}

	WNDCLASS wc;
	::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
	wc.lpszClassName = SCANSETTINGS_CLASSNAME;
	AfxRegisterClass(&wc);
	// End 

	// 其他代码
}

int C**App::ExitInstance()
{
	// TODO: Add your specialized code here and/or call the base class
	if (m_hMutex != NULL)
	{
		CloseHandle(m_hMutex);
		m_hMutex = NULL;
	}

	return CWinAppEx::ExitInstance();
}


最后注意在资源脚本中也应修改

IDD_CONNECT_SETUP DIALOGEX 0, 0, 313, 220
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Scan Settings Tool"
CLASS "ScanSettingsWindowClass" (注意添加这一句)
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END


大致示例也就这样了。至于那个 32770就是标准对话框的,可以用SPY++ 查看下就明白了。

MFC 可以这样做,其他的也类似了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值