以前有想做一个可以定时关闭的消息对话框,后来淡忘了,今天偶尔浏览到有实现这个功能的代码(来自微软),借来用用.
想想也挺简单的.
详细见代码.(在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;  
        }