使用场景:
1.修改按钮文本(一般用于国际化)
2.我们又不想自己写一个窗口来实现MessageBox
3.有时只是为了一个简单的弹框,而文字提示 windows默认的
又不是我们想要的
MessageBox 上的按钮文字并不能直接修改,一种方法可以使用钩子,间接修改按钮上的文字,另一种就是自己做一个类似 MessageBox 功能的对话框。
excample`
// 定义一个钩子句柄
HHOOK hMsgBoxHook;
// 定义CBT钩子过程
LRESULT CALLBACK MsgBoxCBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
switch (nCode) {
case HCBT_ACTIVATE:
HWND hWnd = (HWND)wParam;
SetDlgItemText(hWnd, IDYES, _T("retry"));
SetDlgItemText(hWnd, IDNO, _T("fuck"));
SetDlgItemText(hWnd, IDCANCEL, _T("cancel"));
return 0;
}
return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
}
// 定义一个 MsgBox 函数
int MsgBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
hMsgBoxHook = SetWindowsHookEx(WH_CBT, MsgBoxCBTProc, NULL, GetCurrentThreadId());
int ret = MessageBox(hWnd, lpText, lpCaption, uType);
UnhookWindowsHookEx(hMsgBoxHook);
return ret;
}
void CtestDlg::OnBnClickedButton1()
{
// 调用 MsgBox
MsgBox(GetSafeHwnd(), _T("helloworld?"), _T("IL&RL"), MB_ICONQUESTION | MB_YESNOCANCEL);
}