#前提
VC++で一からExeを作っています。
自作のアイコンを作りました。
#実現したいこと
自作のアイコンをプログラムが表示するメッセージボックスにも表示したいです。
どうすれば表示できますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答3件
0
ベストアンサー
こんな感じでどうですか?
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をします。
今回の質問で参考したのは以下の記事です。
投稿2019/08/29 12:06
編集2019/08/29 22:39総合スコア1627
0
MessageBoxは用意されたオプション以外の事はできません。
例えばビックリマークや☓マークといったあらかじめ用意されているアイコンをメッセージの左に添える事はできますが、自分の好きなアイコン画像を差し込むことはできません。
それがやりたい場合は、自分でダイアログを作ってモーダルダイアログとして表示してください。
試しは事はありませんが(そもそもコンパイル通ら無さそうですが)、
https://www.codeproject.com/Articles/1239/XMessageBox-A-reverse-engineered-MessageBox
こういったオープンソースのメッセージボックスを使うというのも手かもしれません。
投稿2019/08/29 00:44
総合スコア8356
0
どうすれば表示できますか?
似たようなダイアログを自力で作るしかありません。
MessageBoxでは、出せるアイコンは「赤い×」「?マーク」「黄色い三角の中の!」「丸囲みのi」の4つからしか選べません(MSDN)。
投稿2019/08/29 00:44
総合スコア147065
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。

2019/08/30 04:01