Limiting Applications to a Single Instance
Posted
by Jean-Claude Garreau
on August 31st, 2000
The following code is added to the CWinApp-derived class in the 'InitInstance()' function, after the main window has been initialized but not displayed (m_uUserMessage is a UINT member variable of the same class)
// Define a user message indicating that another instance of // the app is trying to run: m_uUserMessage=RegisterWindowMessage("ANOTHER_INSTANCE"); // Test for the presence of another instance from an // existing main window whose handle has previously // be written to the Registry CString strHand=GetProfileString("Control","MainWndHwnd","0"); HWND hWnd; sscanf(strHand,"%ld",&hWnd); // Test existing window if( IsWindow(hWnd) ) // There is an instance running { // Copy to the registry the command line data, as // for example a file name WriteProfileString("Control","CmdLineFile",cmdInfo.m_strFileName); // Sent user message to the running app PostMessage(hWnd,m_uUserMessage,0,0); // Push running app to the foreground SetForegroundWindow(hWnd); // Exit current instance return FALSE; } // No instance running, so save to Registry // the handle of the current app main window hWnd=m_pMainWnd->GetSafeHwnd(); strHand.Format("%ld",hWnd); WriteProfileString("Control","MainWndHwnd",strHand);A 'PreTranslateMessage()' function is surcharged in the CWinApp-derived class ('COneInstanceAppApp', in the present example):
BOOL COneInstanceAppApp::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == m_uUserMessage )
{
// Retrive relevant command line info
CString file=GetProfileString("Control","CmdLineFile","");
if( !file.IsEmpty() )
{
// Do what you want with this info!
}
return TRUE; // User message has been handled
}
return CWinApp::PreTranslateMessage(pMsg);
}

Comments
What I was searching for...
Posted by drnb on 12/07/2004 06:50pmThis article answers the question I was just asking myself. It is simple, and understandable in first reading. However, as one of the comments corretly mention, the author has forgotten the important step of cleaning the registy. If you don't do that, you are unable to make the program run again!!!
ReplyMultiple Instances
Posted by Legacy on 08/04/2002 12:00amOriginally posted by: JOSE MENDOZA
How we can to limit that one progran can be unning by a determined number of instances. This example limits to one instance of the exe. But if I want to let the program to run 2 or 3 (a number determined) times simultaneously.
Replymutex isn't possible?
Posted by Legacy on 06/27/2001 12:00amOriginally posted by: Renato Czar Tome
Why don't you try to use mutex instead?
Reply