限制应用程序的实例数目#
/////////////////////////////////////////////////////////////////////////////
// CTheApp::FirstInstance
// FirstInstance checks for an existing instance of the application.
// If one is found, it is activated.
//
// This function uses a technique similar to that described in KB
// article Q109175 to locate the previous instance of the application.
// However, instead of searching for a matching class name, it searches
// for a matching caption. This allows us to use the normal dialog
// class for our main window. It assumes that the AFX_IDS_APP_TITLE
// string resource matches the caption specified in the dialog template.
BOOL CTheApp::FirstInstance()
{
CString strCaption;
strCaption.LoadString(AFX_IDS_APP_TITLE);
CWnd* pwndFirst = CWnd::FindWindow((LPCTSTR)(DWORD_PTR)WC_DIALOG,
strCaption);
if (pwndFirst)
{
// another instance is already running - activate it
CWnd* pwndPopup = pwndFirst->GetLastActivePopup();
pwndFirst->SetForegroundWindow();
if (pwndFirst->IsIconic())
pwndFirst->ShowWindow(SW_SHOWNORMAL);
if (pwndFirst != pwndPopup)
pwndPopup->SetForegroundWindow();
return FALSE;
}
else
{
// this is the first instance
return TRUE;
}
}
/////////////////////////////////////////////////////////////////////////////
// CTheApp::InitInstance
// InitInstance performs per-instance initialization of the DLGCBAR
// application. If an instance of the application is already running,
// it activates that instance. Otherwise, it creates the modeless
// dialog which serves as the application''s interface.
BOOL CTheApp::InitInstance()
{
if (!FirstInstance())
return FALSE;
}
这里使用了窗口标题进行查找匹配。可以使用内核同步对象来进行准确的匹配和防止同时启动。
基于非模态对话框的MFC工程
关于BLOG客户端的想法