SAMPLE: Limiting 32-bit Applications to a Single InstanceID: Q141752
|
The ONET32 sample application demonstrates how to limit a Microsoft
Foundation Class Library (MFC) application to a single instance.
ONET32.EXE is a self-extracting file and should be executed as
follows:
ONET32 -dThe '-d' option maintains the subdirectory structure. The following file is available for download from the Microsoft Software Library:
~ Onet32.exeFor more information about downloading files from the Microsoft Software Library, please see the following article in the Microsoft Knowledge Base:
Q119591 How to Obtain Microsoft Support Files from Online Services
There are several ways to limit a Windows-based application to a single
instance. This sample program uses a technique in which a custom window
class is registered for the application's main frame window. In subsequent
instances, CWinApp::InitInstance() searches for this window class and then
activates the prior instance.
This technique was chosen is fairly easy to implement.
The following code fragments show the essential requirements of this
technique:
// Add a static BOOL that indicates whether the class was
// registered so that you can unregister it in ExitInstance
static BOOL bClassRegistered = FALSE;
BOOL COneT32App::InitInstance()
{
// If a previous instance of the application is already running,
// then activate it and return FALSE from InitInstance to
// end the execution of this instance.
if(!FirstInstance())
return FALSE;
// Register your unique class name that you wish to use
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(WNDCLASS)); // start with NULL
// defaults
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = LoadIcon(IDR_MAINFRAME); // or load a different
// icon
wndcls.hCursor = LoadCursor( IDC_ARROW );
wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
// Specify your own class name for using FindWindow later
wndcls.lpszClassName = _T("MyNewClass");
// Register the new class and exit if it fails
if(!AfxRegisterClass(&wndcls))
{
TRACE("Class Registration Failed\n");
return FALSE;
}
bClassRegistered = TRUE;
// Rest of InitInstance goes here
...
...
...
}
BOOL COneT32App::FirstInstance()
{
CWnd *pWndPrev, *pWndChild;
// Determine if another window with your class name exists...
if (pWndPrev = CWnd::FindWindow(_T("MyNewClass"),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();
// and you are done activating the previous one.
return FALSE;
}
// First instance. Proceed as normal.
else
return TRUE;
}
int COneT32App::ExitInstance()
{
if(bClassRegistered)
::UnregisterClass(_T("MyNewClass"),AfxGetInstanceHandle());
return CWinApp::ExitInstance();
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// Use the specific class name you established earlier
cs.lpszClass = _T("MyNewClass");
// Change the following line to call
// CFrameWnd::PreCreateWindow(cs) if this is an SDI application.
return CMDIFrameWnd::PreCreateWindow(cs);
}
MFC Technical Note #1 discusses window class registration.
The Following Knowledge Base article discusses how to register MFC window
classes:
Q140596 INFO: MFC 4.0 No Longer Pre-Registers Window Classes
Additional query words: ONETIME
Keywords : kbcode kbfile kbsample kbMFC KbUIDesign kbVC kbVC400 kbVC500 kbVC600
Version : 4.0 5.0 6.0
Platform : NT WINDOWS
Issue type :
Last Reviewed: July 14, 1999