I have a need for this quite often, and while I haven't gotten around to writing my own class to do it, I know of one that works very well. It's called PassiveDialog and comes with the ITCLib package(http://devcentral.iftech.com). If I look at the code (just to get ideas) I find they've overridden the DoModal function: ... TRY { // create modeless dialog AfxHookWindowCreate(this); if (CreateDlgIndirect(lpDialogTemplate, CWnd::FromHandle(m_hWndParent), hInst)) { if (m_nFlags & WF_CONTINUEMODAL) { m_nFlags |= WF_MODALLOOP; ShowWindow(SW_SHOWNORMAL); UpdateWindow(); Pulse(); } } } ... And created a new Pulse function to pass messages back to the calling code: ... // Check to see if we can do idle work while (bIdle && !::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)) { if (!(dwFlags & MLF_NOIDLEMSG) && m_hWndParent && lIdleCount == 0) { ::SendMessage(m_hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd); } if ((dwFlags & MLF_NOKICKIDLE) || !SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++)) { bIdle = FALSE; } } ... For more info, just go download the library. Keep in mind, though, that the code is ©. Hope this helps! -Dave