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