关于如何禁止应用程序的多个实例运行的问题?
如果当前我的应用程序已经有一个实例在运行,我要从命令行方式打开一个文档的时候用当前的实例打开,而不需要再启动一个实例? 问题点数:20、回复次数:2Top
1 楼whiskers(胡子)回复于 2001-12-21 11:11:55 得分 10
将以下代码加入CXxxxApp::InitInstance()的开始即可
::CreateMutex(NULL, TRUE, m_pszExeName);
if(ERROR_ALREADY_EXISTS == GetLastError())
{
CWnd* pPrevHwnd = CWnd::GetDesktopWindow()->GetWindow(GW_CHILD);
while(pPrevHwnd)
{
if(::GetProp(pPrevHwnd->GetSafeHwnd(), m_pszExeName))
{
if(pPrevHwnd->IsIconic())
{
pPrevHwnd->ShowWindow(SW_RESTORE);
}
pPrevHwnd->SetForegroundWindow();
pPrevHwnd->GetLastActivePopup()->SetForegroundWindow();
return FALSE;
}
pPrevHwnd = pPrevHwnd->GetWindow(GW_HWNDNEXT);
}
TRACE("Could not found previous instance main window !");
return FALSE;
}
// 设置标记,以便寻找窗口。在 Destroy 时删除:
::SetProp(m_pMainWnd->GetSafeHwnd(), m_pszExeName, (HANDLE)1);Top
2 楼xiaoxiaohan(萧晓寒)回复于 2001-12-21 11:14:51 得分 10
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hNew = NULL;
DWORD dwErrCode = 0;
hNew = CreateMutex( NULL, FALSE, "{FA123-DKJKL-43443-643FJD3}" );
if ( hNew == NULL )
{
return 0;
}
dwErrCode = GetLastError( );
if ( dwErrCode == ERROR_ALREADY_EXISTS )
{
CloseHandle( hNew );
return 0;
}
// This is the first instance of this application running.
……
……
……
// Before exiting, close the object.
CloseHandle( hNew );
return 0;
}
测试过Top




