こんな感じでどうですか?
C
1HHOOK MyHookHandle;
2
3LRESULT CALLBACK MyMsgBoxHookProc(int nCode, WPARAM wParam, LPARAM lParam)
4{
5 if (nCode == HCBT_ACTIVATE)
6 {
7 SendMessage((HWND)wParam, WM_SETICON, ICON_SMALL, (LPARAM)(HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SMALL), IMAGE_ICON, 16, 16, 0));
8 UnhookWindowsHookEx(MyHookHandle);
9 }
10 return CallNextHookEx(MyHookHandle, nCode, wParam, lParam);
11}
12int MyMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
13{
14 MyHookHandle = SetWindowsHookEx(WH_CBT, MyMsgBoxHookProc, NULL, GetCurrentThreadId());
15 return (MessageBox(hWnd, lpText, lpCaption, uType));
16}
IDI_SMALLの部分にお好みのリソースIDを入れてください。
原理を解説します。
メッセージボックスはダイアログボックスの一種なのでウィンドウハンドルを取得してWM_SETICONでアイコンのハンドルを指定すればよいと予想されます。ただ、メッセージボックスのウィンドウハンドルがMessageBox関数内で隠蔽されており、ダイアログボックス表示処理への介入もできないと思ってしまいます。
それを覆すのがSetWindowsHookEx関数によるフック処理です。
この関数を使うといろいろな処理がフックできます。
これでメッセージボックスがアクティブになる瞬間を捕まえて、パラメタで渡されたメッセージボックスのウィンドウハンドルに対しWM_SETICONをします。
今回の質問で参考したのは以下の記事です。
MessageBoxのはい/いいえ/キャンセルの文字を変更する