Make your dialog resource invisible using the styles tab in the dialog properties. Remove all the DoModal gunk from your InitInstance, so you end up with something like this : BOOL CMyApp::InitInstance() { #ifdef _AFXDLL Enable3dControls(); // using MFC in a shared DLL #else Enable3dControlsStatic(); // linking to MFC statically #endif m_pMainWnd = new CMyModelessDlg; if (m_pMainWnd) return TRUE; else return FALSE; } I place the call to Create (...) in my dialog constructor and make it public. Other people organise things differently but it works for me... curse the OOP thought police : CMyModelessDlg::CMyModelessDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyModelessDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMyModelessDlg) //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); Create (IDD, pParent); // Create modeless dialog. } You will need to handle PostNcDestroy and delete the dialog object yourself (ClassWizard can set up the handler for you) : void CMyModelessDlg::PostNcDestroy() { delete this; } You may find that if you call DestroyWindow from within your dialog in order to shut down, you will have to call your own PostNcDestroy in order to avoid a leak. Watch the debug output from your app running in debug mode - if this is the case MFC will helpfully give you a warning there. Here's the normal WM_CLOSE handler: void CMyModelessDlg::OnClose()  { if (m_bOkToClose) { CleanUp (); DestroyWindow (); } else { ShowWindow (SW_HIDE); } } I use the m_bOkToClose flag to distinguish when I'm permitting the user to close down and when I want that action to simply hide the window. Cleanup is a function that does any necessary CloseHandles, removes any tray icons and deletes any allocated memory.