关于弹出消息窗口的自动关闭

本文介绍两种实现MessageBox自动关闭的方法。方法一通过直接在代码中添加特定API实现,适用于Windows2000以上的系统。方法二利用了微软未公开的API,通过加载user32.dll并调用其中的MessageBoxTimeout函数来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.方法1

1.1. 直接在代码中添加

// 弹出消息窗口自动关闭,需要指出的是,Windows 2000的user32.dll没有导出这个函数。
extern "C"
{
    int WINAPI MessageBoxTimeoutA(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType, IN WORD wLanguageId, IN DWORD dwMilliseconds);
    int WINAPI MessageBoxTimeoutW(IN HWND hWnd, IN LPCWSTR lpText, IN LPCWSTR lpCaption, IN UINT uType, IN WORD wLanguageId, IN DWORD dwMilliseconds);
};
#ifdef UNICODE
#define MessageBoxTimeout MessageBoxTimeoutW
#else
#define MessageBoxTimeout MessageBoxTimeoutA
#endif

1.2. 调用

    MessageBoxTimeout(this->GetSafeHwnd(), _T("弹出5秒后会自动关闭!这是一个模态对话框。"), _T("会自动关闭的MessageBox"),  MB_ICONINFORMATION, GetSystemDefaultLangID(), 5000);
    //参数说明:父窗口的句柄为NULL的情况下,将弹出非模态对话框;延时关闭的时间为0的情况下,弹出的MessageBox需要手动关闭
    MessageBoxTimeout(NULL, _T("弹出5秒后会自动关闭!这是一个非模态对话框。"), _T("会自动关闭的MessageBox"),  MB_ICONINFORMATION, GetSystemDefaultLangID(), 5000);


参考网址:http://blog.sina.com.cn/s/blog_4b0f3b420100mglb.html


win7 x86,vs2013,测试通过


2.方法2


2.1.此api是微软的一个未公开api,在user32.dll中,功能就是弹出一个对话框MessageBox,并定时自动退出。 
下面为头文件,随便取个名字,我取的是MsgBoxTimeout.h 。

#include <windows.h>
#include <tchar.h>

//Functions & other definitions required-->
typedef int (__stdcall *MSGBOXAAPI)(IN HWND hWnd, 
        IN LPCSTR lpText, IN LPCSTR lpCaption, 
        IN UINT uType, IN WORD wLanguageId, IN DWORD dwMilliseconds);
typedef int (__stdcall *MSGBOXWAPI)(IN HWND hWnd, 
        IN LPCWSTR lpText, IN LPCWSTR lpCaption, 
        IN UINT uType, IN WORD wLanguageId, IN DWORD dwMilliseconds);

int MessageBoxTimeoutA(IN HWND hWnd, IN LPCSTR lpText, 
    IN LPCSTR lpCaption, IN UINT uType, 
    IN WORD wLanguageId, IN DWORD dwMilliseconds);
int MessageBoxTimeoutW(IN HWND hWnd, IN LPCWSTR lpText, 
    IN LPCWSTR lpCaption, IN UINT uType, 
    IN WORD wLanguageId, IN DWORD dwMilliseconds);

#ifdef UNICODE
    #define MessageBoxTimeout MessageBoxTimeoutW
#else
    #define MessageBoxTimeout MessageBoxTimeoutA
#endif 

#define MB_TIMEDOUT 32000

int MessageBoxTimeoutA(HWND hWnd, LPCSTR lpText, 
    LPCSTR lpCaption, UINT uType, WORD wLanguageId, 
    DWORD dwMilliseconds)
{
    static MSGBOXAAPI MsgBoxTOA = NULL;

    if (!MsgBoxTOA)
    {
        HMODULE hUser32 = GetModuleHandle(_T("user32.dll"));
        if (hUser32)
        {
            MsgBoxTOA = (MSGBOXAAPI)GetProcAddress(hUser32, 
                                      "MessageBoxTimeoutA");
            //fall through to 'if (MsgBoxTOA)...'
        }
        else
        {
            //stuff happened, add code to handle it here 
            //(possibly just call MessageBox())
            return 0;
        }
    }

    if (MsgBoxTOA)
    {
        return MsgBoxTOA(hWnd, lpText, lpCaption, 
              uType, wLanguageId, dwMilliseconds);
    }

    return 0;
}

int MessageBoxTimeoutW(HWND hWnd, LPCWSTR lpText, 
    LPCWSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds)
{
    static MSGBOXWAPI MsgBoxTOW = NULL;

    if (!MsgBoxTOW)
    {
        HMODULE hUser32 = GetModuleHandle(_T("user32.dll"));
        if (hUser32)
        {
            MsgBoxTOW = (MSGBOXWAPI)GetProcAddress(hUser32, 
                                      "MessageBoxTimeoutW");
            //fall through to 'if (MsgBoxTOW)...'
        }
        else
        {
            //stuff happened, add code to handle it here 
            //(possibly just call MessageBox())
            return 0;
        }
    }

    if (MsgBoxTOW)
    {
        return MsgBoxTOW(hWnd, lpText, lpCaption, 
               uType, wLanguageId, dwMilliseconds);
    }

    return 0;
}
//End required definitions <--

2.2. 调用方式

#include "MsgBoxTimeout.h"
void CTestDlg::OnBnClickedButton2()
{
    //you must load user32.dll before calling the function
    HMODULE hUser32 = LoadLibrary(_T("user32.dll"));

    if (hUser32)
    {
        int iRet = 0;
        UINT uiFlags = MB_OK | MB_SETFOREGROUND | MB_SYSTEMMODAL | MB_ICONINFORMATION;

        iRet = MessageBoxTimeout(NULL, _T("Test a timeout of 2 seconds."),
            _T("MessageBoxTimeout Test"), uiFlags, 0, 2000);
        //iRet will = 1

        uiFlags = MB_YESNO | MB_SETFOREGROUND | MB_SYSTEMMODAL | MB_ICONINFORMATION;

        iRet = MessageBoxTimeout(NULL, _T("Test a timeout of 5 seconds."),
            _T("MessageBoxTimeout Test"), uiFlags, 0, 5000);
        //iRet will = MB_TIMEDOUT if no buttons pressed, button values otherwise

        //only unload user32.dll when you have no further need 
        //for the MessageBoxTimeout function
        FreeLibrary(hUser32);
    }
}


参考网址:http://blog.youkuaiyun.com/a379039233/article/details/49445207

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值