Introduction
There are lots of articles on CodeGuru about limiting your program to a single instance. In this article, I want to show how easily it can be done by simply modifying the dialog template and adding few lines of code in InitInstance(). Although I use MFC for this sample, you can use the same technique for ATL/WTL and generic Win32 applications.
Implementation
- Create an MFC dialog-based project.
- Open the Resource Script file (.rc), find your main dialog template, and add the following lines:
CLASS "SINGLE_INSTANCE_APP" IDD_SINGLEINSTANCE_DIALOG DIALOGEX 0, 0, 320, 200 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CLASS "SINGLE_INSTANCE_APP" CAPTION "Single Instance Application" ...
This will instruct Windows to use your own windows class “SINGLE_INSTANCE_APP” instead of a standard dialog class.
- Now, you have to register the “SINGLE_INSTANCE_APP” windows class. The best place for this is InitInstance().
WNDCLASS wc = {0}; wc.style = CS_BYTEALIGNWINDOW|CS_SAVEBITS|CS_DBLCLKS; wc.lpfnWndProc = DefDlgProc; wc.cbWndExtra = DLGWINDOWEXTRA; wc.hInstance = m_hInstance; wc.hIcon = LoadIcon(IDR_MAINFRAME); wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); wc.lpszClassName = _T("SINGLE_INSTANCE_APP"); ATOM cls = RegisterClass(&wc);
CWnd* pWnd = CWnd::FindWindow(_T("SINGLE_INSTANCE_APP"), NULL); if (pWnd) { pWnd->ShowWindow(SW_SHOW); pWnd->SetForegroundWindow(); return FALSE; }