MessageBox 函数需包含 Windows.h 头文件,原型为 int MessageBox(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);必须用宽字符串 L"" 且在主线程调用,返回值为按钮 ID(如 IDYES),不可硬编码数字比较。

调用 MessageBox 前必须包含 Windows.h,否则编译器不认识这个函数。它不是 C++ 标准库函数,而是 Windows SDK 提供的 C 风格 API,所以参数类型全是 Win32 类型(比如 LPCWSTR 而不是 std::wstring)。
常见错误是直接传 std::string 或字面量字符串(如 "Hello")导致编译失败或乱码——因为默认项目启用了 Unicode 字符集,MessageBox 实际展开为 MessageBoxW,只接受宽字符。
L"内容" 写宽字符串字面量MessageBoxA 并传 "内容"(但不推荐,跨平台和本地化支持差)int MessageBox(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
不需要窗口句柄也能弹窗,把第一个参数设为 NULL 即可。下面这段代码在控制台或 GUI 项目里都能直接运行:
#includeint main() { MessageBox(NULL, L"操作已完成", L"提示", MB_OK | MB_ICONINFORMATION); return 0; }
注意:MB_OK | MB_ICONINFORMATION 是位或组合的标志,不是加法;MB_OK 表示只显示“确定”按钮,MB_ICONINFORMATION 加个信息图标。其他常用标志包括 MB_YESNO、MB_ICONWARNING、MB_ICONERROR。
MessageBox 返回值是 int,对应用户点击的按钮 ID,不是布尔值。比如用户点“是”,返回 IDYES;点“否”,返回 IDNO;点“确定”,返回 IDOK。
IDYES)比较,不能硬写数字(不同 Windows 版本可能变化)MB_YESNO,典型判断写法:if (MessageBox(..., MB_YESNO) == IDYES) { ... }
IDABORT、IDRETRY 等,取决于你传的按钮类型多数问题出在字符串编码和线程模型上:
MessageBox 可能卡死或报错——Windows GUI API 要求调用线程已初始化消息循环(CoInitializeEx + 消息泵),控制台主线程默认没有,但系统会做隐式兼容;稳妥做法仍是只在主线程调用lpText 或 lpCaption 会导致崩溃,哪怕只是 NULL 也不行,至少填 L""
MessageBoxA,会链接失败或弹出乱码框真正要注意的其实是上下文:它是个阻塞式 API,弹出后当前线程会挂起,直到用户关闭窗口。别在性能敏感路径或网络回调里滥用。