以前有想做一个可以定时关闭的消息对话框,后来淡忘了,今天偶尔浏览到有实现这个功能的代码(来自微软),借来用用.
想想也挺简单的.
详细见代码.(在VC6.0中测试OK,WINDOWS XP).
 /***********************************************************************   
              THIS   CODE   AND   INFORMATION   IS   PROVIDED   "AS   IS"   WITHOUT   WARRANTY   OF   
              ANY   KIND,   EITHER   EXPRESSED   OR   IMPLIED,   INCLUDING   BUT   NOT   LIMITED   TO   
              THE   IMPLIED   WARRANTIES   OF   MERCHANTABILITY   AND/OR   FITNESS   FOR   A   
              PARTICULAR   PURPOSE.   
    
              Copyright 1998 Microsoft Corporation. All Rights Reserved.   
        ***********************************************************************/     
    
        /***********************************************************************   
          *   
          *     MsgBox.c   
          *   
          *     Abstract:   
          *   
          *             Sample   program   to   demonstrate   how   a   program   can   display   a   
          *             timed   message   box.   
          *   
          **********************************************************************/     
    
        #define   STRICT   
        #include   <windows.h>   
    
        /**********************************************************************   
          *   
          *             Overview   
          *   
          *             The   key   to   creating   a   timed   message   box   is   exiting   the   dialog   
          *             box   message   loop   internal   to   the   message   box.   Since   the   
          *             message   loop   for   a   message   box   is   part   of   USER,   you   cannot   
          *             modify   it   without   using   hooks   and   other   such   methods.   
    
          *   
          *             However,   all   message   loops   exit   when   they   receive   a   
          *             WM_QUIT   message.   Furthermore,   a   nested   message   loop,   if   it   
          *             receives   a   WM_QUIT   message,   must   break   the   loop   and   then   re-post   
          *             the   quit   message   so   that   the   next   outer   layer   can   process   it.   
          *   
          *             Therefore,   you   can   get   the   nested   message   loop   to   exit   by   
          *             calling   PostQuitMessage().   The   nested   message   loop   will   
          *             clean   up   and   post   a   new   quit   message.   When   the   MessageBox   
          *             returns,   you   peek   to   see   if   there   is   a   quit   message.   If   so,   
          *             then   it   means   that   the   message   loop   was   abnormally   terminated.   
          *             You   also   consume   the   WM_QUIT   message   instead   of   re-posting   it   
          *             so   that   the   application   continues   running.   
          *   
          *             Essentially,   you   have   "tricked"   the   nested   message   loop   into   
          *             thinking   that   the   application   is   terminating.   When   it   returns,   
          *             you   "eat"   the   quit   message,   effectively   canceling   the   fake   
          *             quit   that   you   generated.   
          *   
          **********************************************************************/     
    
        /**********************************************************************   
          *   
          *     MessageBoxTimer   
          *   
          *             The   timer   callback   function   that   posts   the   fake   quit   message,   
          *             which   causes   the   message   box   to   exit   because   it   thinks   that   
          *             the   application   is   exiting.   
          *   
    
          **********************************************************************/     
    
        void  CALLBACK   MessageBoxTimer(HWND   hwnd,   UINT   uiMsg,   UINT   idEvent,   DWORD   dwTime)   
        {   
                PostQuitMessage(0);   
        }   
    
        /***********************************************************************   
          *   
          *     TimedMessageBox   
          *   
          *             The   same   as   the   standard   MessageBox,   except   it   also   accepts   
          *             a   timeout.   If   the   user   does   not   respond   within   the   
          *             specified   timeout,   then   the   value   0   is   returned   instead   
          *             of   one   of   the   ID*   values.   
          *   
          **********************************************************************/     
    
        UINT  TimedMessageBox(HWND   hwndParent, LPCTSTR   ptszMessage,LPCTSTR   ptszTitle,UINT   flags, DWORD   dwTimeout)   
        {   
                UINT   idTimer;   
                UINT   uiResult;   
                MSG   msg;   
    
                /*   
                  *     Set   a   timer   to   dismiss   the   message   box.   
                */     
                idTimer   =   SetTimer(NULL,   0,   dwTimeout,   (TIMERPROC)MessageBoxTimer);   
    
                uiResult   =   MessageBox(hwndParent,   ptszMessage,   ptszTitle,   flags);   
    
                /*   
                  *     Finished   with   the   timer.   
                */     
                KillTimer(NULL,   idTimer);   
    
                /*   
                  *     See   if   there   is   a   WM_QUIT   message   in   the   queue.   If   so,   
                  *     then   you   timed   out.   Eat   the   message   so   you   don't   quit   the   
                  *     entire   application.   
                */     
                if   (PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE))   {   
    
                        /*   
                          *     If   you   timed   out,   then   return   zero.   
                        */     
                        uiResult   =   0;   
                }   
    
                return   uiResult;   
        }   
    
        /***********************************************************************   
          *   
          *     WinMain   
          *   
          *             Program   entry   point.   
          *   
          *             Demonstrate   TimedMessageBox().   
          *   
          **********************************************************************/     
    
        int   WINAPI   WinMain(  HINSTANCE   hinst,  HINSTANCE   hinstPrev, LPSTR   pszCmdLine,  int   nCmdShow)   
        {   
    
                UINT   uiResult;   
    
                /*   
                  *     Ask   the   user   a   question,   and   give   him   or   her   five   seconds   to   
                  *     answer   it.   
                  */     
    
                uiResult   =   TimedMessageBox(NULL,"Does a triangle have three sides?","Quiz", MB_YESNO,5000);   //   NULL   first   parameter   is   important.   
    
    
                switch   (uiResult)   {   
                case   IDYES:   
                        MessageBox(NULL,   "That's   right!",   "Result",   MB_OK);   
                        break;   
    
                case   IDNO:   
                        MessageBox(NULL,   "Believe   it   or   not,   triangles   "   
                                                          "really   do   have   three   sides.",   "Result",   
                                              MB_OK);   
                        break;   
    
                case   0:   
                        MessageBox(NULL,   "I   sensed   some   hesitation   there.     "   
                                                          "The   correct   answer   is   Yes.",   "Result",   MB_OK);   
                        break;   
                }   
    
                return   0;   
        }