C# MessageBoxの使い方を徹底解説|表示・ボタン・アイコン・戻り値まで

はじめに

C#でデスクトップアプリを作っていると、「処理が完了しました」「本当に削除しますか?」「入力内容に誤りがあります」といったメッセージをユーザーに表示したい場面がよくあります。そのときに使われる代表的な機能が MessageBox です。

C# MessageBoxは、短い通知や確認を表示するためのシンプルなダイアログです。ボタン、アイコン、タイトル、戻り値を組み合わせることで、単なる通知だけでなく、ユーザーの選択に応じた処理分岐もできます。

この記事では、C#のMessageBox.Showの基本から、ボタン指定、アイコン指定、戻り値の取得、WinFormsとWPFの違い、よくあるエラーまでを順番に解説します。

1. C#のMessageBoxとは?できることと使う場面

C#のMessageBoxとは、ユーザーにメッセージを表示するためのダイアログボックスです。WinFormsでは System.Windows.Forms.MessageBox、WPFでは System.Windows.MessageBox を使います。

MessageBoxはモーダルダイアログとして表示され、ユーザーが閉じるまでアプリケーション側の操作を一時的に止めます。WinFormsのMessageBoxは、テキスト、ボタン、シンボルを含めてユーザーに通知できる仕組みとして定義されています。

1-1. MessageBoxでできること

MessageBoxでは、主に次のようなことができます。

・メッセージを表示する
・タイトルを付ける
・OK、Cancel、Yes、Noなどのボタンを表示する
・情報、警告、エラーなどのアイコンを表示する
・押されたボタンを戻り値として受け取る
・戻り値に応じて処理を分岐する
・親フォームや親ウィンドウを指定して表示する
・デフォルトで選択されるボタンを指定する

たとえば、保存処理が完了したときは情報メッセージを表示し、削除前には「はい」「いいえ」で確認し、エラー発生時にはエラーアイコン付きのメッセージを表示できます。

1-2. WinFormsとWPFで使い方が異なる点

C# MessageBoxは、WinFormsとWPFで似たように使えますが、指定する列挙型の名前が異なります。

WinFormsでは次のように書きます。

C#
using System.Windows.Forms;

MessageBox.Show(
"削除しますか?",
"確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);

WPFでは次のように書きます。

C#
using System.Windows;

MessageBox.Show(
"削除しますか?",
"確認",
MessageBoxButton.YesNo,
MessageBoxImage.Question);

大きな違いは、WinFormsでは MessageBoxButtonsMessageBoxIconDialogResult を使い、WPFでは MessageBoxButtonMessageBoxImageMessageBoxResult を使う点です。WPFのMessageBox.Showは、メッセージ、タイトル、アイコン、ボタンを指定でき、結果を返すメソッドとして用意されています。

1-3. この記事で扱うサンプルコードの前提

この記事では、基本的にWinFormsのMessageBoxを中心に解説します。

C#
using System.Windows.Forms;

WinFormsアプリのフォーム内で実行する想定です。

WPFで使う場合は、次のように読み替えてください。

C#
using System.Windows;

また、WinFormsとWPFを同じプロジェクト内で参照している場合、MessageBox という名前が競合することがあります。その場合は、次のように完全修飾名で書くと安全です。

C#
System.Windows.Forms.MessageBox.Show("WinFormsのMessageBoxです。");
C#
System.Windows.MessageBox.Show("WPFのMessageBoxです。");

2. MessageBox.Showの基本的な使い方

MessageBoxを表示するには、MessageBox.Show メソッドを使います。最も簡単な使い方は、表示したい文字列を1つ渡すだけです。

2-1. 最小コードでメッセージを表示する

C#
MessageBox.Show("処理が完了しました。");

このコードを実行すると、「処理が完了しました。」というメッセージとOKボタンが表示されます。

最小構成では、タイトルやアイコンは表示されません。まずはユーザーに簡単な通知を出したいだけなら、この形で十分です。

2-2. タイトル付きで表示する

MessageBoxにタイトルを付けたい場合は、第2引数にタイトル文字列を指定します。

C#
MessageBox.Show("処理が完了しました。", "完了");

第1引数が本文、第2引数がタイトルです。

C#
MessageBox.Show("ファイルの保存に成功しました。", "保存完了");

タイトルを付けることで、ユーザーはそのメッセージが何に関するものなのかを理解しやすくなります。

2-3. 改行や変数を使ってメッセージを整える

MessageBoxの本文には、改行や変数を含めることもできます。

C#
string fileName = "sample.txt";

MessageBox.Show(
$"ファイルを保存しました。\n\nファイル名: {fileName}",
"保存完了");

\n を使うと改行できます。Windowsアプリでは Environment.NewLine を使う書き方もよく使われます。

C#
string userName = "山田太郎";

MessageBox.Show(
"ユーザー情報を登録しました。" + Environment.NewLine +
"ユーザー名: " + userName,
"登録完了");

複数行のメッセージを表示するときは、情報を詰め込みすぎないようにしましょう。MessageBoxは短い通知に向いているため、長文の説明にはあまり適していません。

2-4. 日本語メッセージを表示するときの注意点

日本語メッセージを表示するときは、意味があいまいにならない表現を心がけます。

たとえば、次のメッセージは少し不親切です。

C#
MessageBox.Show("エラーです。");

何が起きたのか分からないため、ユーザーは次に何をすればよいか判断できません。

次のように、原因や対応を含めると分かりやすくなります。

C#
MessageBox.Show(
"入力されたメールアドレスの形式が正しくありません。\n正しい形式で入力してください。",
"入力エラー");

日本語のMessageBoxでは、次の点を意識すると読みやすくなります。

・一文を短くする
・専門用語を避ける
・原因と対処を分けて書く
・必要に応じて改行する
・ユーザーを責める表現を避ける

「失敗しました」だけで終わらせず、「何が失敗したのか」「どうすればよいのか」を伝えることが大切です。

3. MessageBoxに表示するボタンを指定する方法

MessageBoxでは、表示するボタンを MessageBoxButtons で指定できます。ボタンを指定することで、ユーザーに確認、選択、再試行などの操作を促せます。

基本形は次のとおりです。

C#
MessageBox.Show(
"メッセージ本文",
"タイトル",
MessageBoxButtons.OK);

3-1. OKボタンだけを表示する

OKボタンだけを表示する場合は、MessageBoxButtons.OK を指定します。

C#
MessageBox.Show(
"処理が完了しました。",
"完了",
MessageBoxButtons.OK);

OKボタンは、単純な通知に向いています。

・保存が完了した
・登録が完了した
・処理が終了した
・入力内容に誤りがあることを知らせる

ユーザーに選択させる必要がない場合は、OKボタンだけで十分です。

3-2. OKCancelボタンを表示する

OKとCancelを表示するには、MessageBoxButtons.OKCancel を指定します。

C#
DialogResult result = MessageBox.Show(
"設定を反映しますか?",
"確認",
MessageBoxButtons.OKCancel);

if (result == DialogResult.OK)
{
// OKが押されたときの処理
}
else
{
// Cancelが押されたときの処理
}

OKCancelは、「実行するか、やめるか」を確認したい場面に向いています。

ただし、日本語UIでは「OK」よりも「はい」「いいえ」の方が自然な場合もあります。その場合は YesNo を使うと分かりやすくなります。

3-3. YesNoボタンを表示する

YesとNoを表示するには、MessageBoxButtons.YesNo を指定します。

C#
DialogResult result = MessageBox.Show(
"このデータを削除しますか?",
"削除確認",
MessageBoxButtons.YesNo);

if (result == DialogResult.Yes)
{
// 削除処理
}
else
{
// 削除しない
}

YesNoは、ユーザーに明確な選択を求めるときに便利です。

・削除しますか?
・上書き保存しますか?
・変更を破棄しますか?
・処理を続行しますか?

このような質問には、OKCancelよりもYesNoの方が意味が伝わりやすいことがあります。

3-4. YesNoCancelボタンを表示する

Yes、No、Cancelを表示するには、MessageBoxButtons.YesNoCancel を指定します。

C#
DialogResult result = MessageBox.Show(
"変更内容を保存しますか?",
"保存確認",
MessageBoxButtons.YesNoCancel);

if (result == DialogResult.Yes)
{
// 保存して閉じる
}
else if (result == DialogResult.No)
{
// 保存せずに閉じる
}
else if (result == DialogResult.Cancel)
{
// 閉じる処理を中止する
}

YesNoCancelは、特にアプリ終了時や画面を閉じる前の保存確認でよく使われます。

「保存する」「保存しない」「操作を中止する」という3つの選択肢を表現できるためです。

3-5. RetryCancel・AbortRetryIgnoreの使いどころ

RetryCancel は、処理に失敗したあとで再試行するかどうかを確認したい場合に使います。

C#
DialogResult result = MessageBox.Show(
"ファイルの読み込みに失敗しました。再試行しますか?",
"読み込みエラー",
MessageBoxButtons.RetryCancel,
MessageBoxIcon.Warning);

if (result == DialogResult.Retry)
{
// 再試行処理
}

AbortRetryIgnore は、処理を中止する、再試行する、無視して続行する、という選択肢を表示します。

C#
DialogResult result = MessageBox.Show(
"一部のデータ処理に失敗しました。",
"処理エラー",
MessageBoxButtons.AbortRetryIgnore,
MessageBoxIcon.Error);

ただし、AbortRetryIgnore はユーザーにとって意味が分かりにくい場合があります。業務アプリでは、「中止」「再試行」「無視」の意味を本文で丁寧に説明するか、カスタムダイアログを使った方がよい場面もあります。

4. MessageBoxにアイコンを表示する方法

MessageBoxには、MessageBoxIcon を指定してアイコンを表示できます。アイコンを付けると、メッセージの重要度や種類が視覚的に伝わりやすくなります。

基本形は次のとおりです。

C#
MessageBox.Show(
"メッセージ本文",
"タイトル",
MessageBoxButtons.OK,
MessageBoxIcon.Information);

4-1. Informationアイコンを表示する

情報メッセージを表示する場合は、MessageBoxIcon.Information を使います。

C#
MessageBox.Show(
"保存が完了しました。",
"保存完了",
MessageBoxButtons.OK,
MessageBoxIcon.Information);

Informationは、正常終了や案内に向いています。

・保存完了
・登録完了
・送信完了
・処理完了
・お知らせ

ユーザーに安心してもらうための通知に適しています。

4-2. Warningアイコンを表示する

警告を表示する場合は、MessageBoxIcon.Warning を使います。

C#
MessageBox.Show(
"未保存の変更があります。画面を閉じる前に保存してください。",
"警告",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);

Warningは、致命的ではないものの注意が必要な場面に向いています。

・未保存のデータがある
・入力内容に注意が必要
・削除前の確認
・続行すると影響がある操作

エラーではないが、ユーザーに慎重な判断を促したいときに使います。

4-3. Errorアイコンを表示する

エラーを表示する場合は、MessageBoxIcon.Error を使います。

C#
MessageBox.Show(
"ファイルの保存に失敗しました。",
"エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);

Errorは、処理が失敗した場合や、ユーザーが修正しないと先に進めない場合に使います。

C#
MessageBox.Show(
"必須項目が入力されていません。\n氏名を入力してください。",
"入力エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);

エラー表示では、単に「エラー」と表示するだけでなく、原因と次の操作を伝えることが重要です。

4-4. Questionアイコンを表示する

質問や確認を表示する場合は、MessageBoxIcon.Question を使えます。

C#
DialogResult result = MessageBox.Show(
"このデータを削除しますか?",
"確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);

ただし、確認ダイアログでは Question ではなく Warning を使った方が意図が伝わりやすい場合もあります。

たとえば、削除や上書きのように取り消しが難しい操作では、単なる質問ではなく注意喚起として表示した方が自然です。

C#
DialogResult result = MessageBox.Show(
"削除すると元に戻せません。\nこのデータを削除しますか?",
"削除確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);

4-5. アイコンを使い分ける判断基準

アイコンは、次のように使い分けると分かりやすくなります。

Informationは、正常終了や案内に使います。

C#
MessageBoxIcon.Information

Warningは、注意や確認に使います。

C#
MessageBoxIcon.Warning

Errorは、処理失敗や入力エラーに使います。

C#
MessageBoxIcon.Error

Questionは、単純な質問に使います。

C#
MessageBoxIcon.Question

重要なのは、本文、タイトル、アイコンの意味を一致させることです。

たとえば、タイトルが「エラー」なのにInformationアイコンを使うと、ユーザーは混乱します。逆に、軽い案内なのにErrorアイコンを使うと、必要以上に不安を与えてしまいます。

5. MessageBoxの戻り値を取得して処理を分岐する

MessageBox.Showは、ユーザーが押したボタンを戻り値として返します。WinFormsでは戻り値の型は DialogResult です。

5-1. DialogResultとは

DialogResult は、ダイアログでユーザーがどのボタンを押したかを表す列挙型です。

代表的な値は次のとおりです。

C#
DialogResult.OK
DialogResult.Cancel
DialogResult.Yes
DialogResult.No
DialogResult.Retry
DialogResult.Abort
DialogResult.Ignore

戻り値を受け取ることで、「Yesが押されたら削除する」「Cancelが押されたら中止する」といった処理を書けます。

C#
DialogResult result = MessageBox.Show("確認メッセージ");

5-2. OKが押されたときだけ処理する

OKが押されたときだけ処理したい場合は、次のように書きます。

C#
DialogResult result = MessageBox.Show(
"処理を開始します。",
"確認",
MessageBoxButtons.OKCancel);

if (result == DialogResult.OK)
{
StartProcess();
}

メソッドにすると、より読みやすくなります。

C#
private void StartProcess()
{
MessageBox.Show("処理を実行しました。");
}

OKCancelの場合、Cancelが押されたときは何もしない、という設計もよくあります。

C#
if (result != DialogResult.OK)
{
return;
}

StartProcess();

この書き方は、早期リターンにより処理のネストを浅くできるため便利です。

5-3. Yes・Noで処理を分ける

YesとNoで処理を分ける場合は、DialogResult.YesDialogResult.No を比較します。

C#
DialogResult result = MessageBox.Show(
"このユーザーを削除しますか?",
"削除確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);

if (result == DialogResult.Yes)
{
DeleteUser();
}
else if (result == DialogResult.No)
{
MessageBox.Show("削除をキャンセルしました。");
}

実務では、Noの場合にメッセージを出さず、そのまま何もしないケースも多いです。

C#
if (result == DialogResult.Yes)
{
DeleteUser();
}

5-4. Cancelや×ボタンが押された場合の扱い

CancelボタンがあるMessageBoxでは、ユーザーがCancelを押した場合に DialogResult.Cancel が返ります。

C#
DialogResult result = MessageBox.Show(
"変更内容を保存しますか?",
"確認",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);

if (result == DialogResult.Cancel)
{
return;
}

注意したいのは、OKボタンと右上の×ボタンを厳密に区別したい場合です。MessageBoxでは、ボタン構成によって×ボタンの扱いが変わるため、「OKを押したのか」「×で閉じたのか」を細かく判定したい設計には向いていません。

×ボタンまで明確に区別したい場合は、MessageBoxではなくカスタムダイアログを作成する方が安全です。

5-5. switch文で戻り値を分岐する

戻り値の分岐が多い場合は、switch 文を使うと見通しがよくなります。

C#
DialogResult result = MessageBox.Show(
"変更内容を保存しますか?",
"保存確認",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);

switch (result)
{
case DialogResult.Yes:
SaveData();
Close();
break;

case DialogResult.No:
Close();
break;

case DialogResult.Cancel:
// 何もしない
break;
}

C#のswitch式を使うこともできますが、MessageBoxの後に複数の処理を行う場合は、通常のswitch文の方が分かりやすいことが多いです。

6. MessageBoxの実用サンプル集

ここからは、実際のアプリでよく使うMessageBoxのサンプルを紹介します。

6-1. 確認ダイアログを表示する

処理を実行する前に確認したい場合のサンプルです。

C#
DialogResult result = MessageBox.Show(
"処理を実行します。よろしいですか?",
"確認",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question);

if (result != DialogResult.OK)
{
return;
}

// 実行したい処理
ExecuteProcess();

OKが押された場合だけ処理を続行します。

6-2. 削除前にYes/Noで確認する

削除処理では、YesNoとWarningアイコンを組み合わせると分かりやすくなります。

C#
DialogResult result = MessageBox.Show(
"選択したデータを削除します。\n削除後は元に戻せません。\n\n本当に削除しますか?",
"削除確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);

if (result == DialogResult.Yes)
{
DeleteSelectedData();

MessageBox.Show(
"削除しました。",
"削除完了",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

削除のような取り消しにくい操作では、「元に戻せません」と明記しておくと親切です。

6-3. 保存確認メッセージを表示する

画面を閉じる前に保存確認を行うサンプルです。

C#
DialogResult result = MessageBox.Show(
"変更内容を保存しますか?",
"保存確認",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);

switch (result)
{
case DialogResult.Yes:
SaveData();
Close();
break;

case DialogResult.No:
Close();
break;

case DialogResult.Cancel:
// 閉じる処理を中止
break;
}

このパターンは、テキストエディタ、設定画面、入力フォームなどでよく使われます。

6-4. エラー発生時に警告を表示する

例外が発生したときにMessageBoxでエラーを表示するサンプルです。

C#
try
{
SaveData();
}
catch (Exception ex)
{
MessageBox.Show(
"データの保存中にエラーが発生しました。\n\n" + ex.Message,
"保存エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}

開発中は ex.Message を表示すると原因を確認しやすいですが、一般ユーザー向けのアプリでは内部的なエラー内容をそのまま表示しない方がよい場合もあります。

ユーザー向けには、次のように書くと自然です。

C#
MessageBox.Show(
"データの保存中にエラーが発生しました。\n時間をおいて再度お試しください。",
"保存エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);

6-5. 入力チェックの結果を表示する

入力フォームで未入力チェックを行う例です。

C#
if (string.IsNullOrWhiteSpace(txtName.Text))
{
MessageBox.Show(
"氏名を入力してください。",
"入力エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);

txtName.Focus();
return;
}

複数項目をチェックする場合は、エラーメッセージをまとめて表示することもできます。

C#
List<string> errors = new List<string>();

if (string.IsNullOrWhiteSpace(txtName.Text))
{
errors.Add("氏名を入力してください。");
}

if (string.IsNullOrWhiteSpace(txtEmail.Text))
{
errors.Add("メールアドレスを入力してください。");
}

if (errors.Count > 0)
{
MessageBox.Show(
string.Join(Environment.NewLine, errors),
"入力エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);

return;
}

入力エラーが複数ある場合、1つずつMessageBoxを表示するとユーザーの操作が増えてしまいます。まとめて表示した方が使いやすい場合があります。

7. MessageBoxの表示位置・前面表示・親ウィンドウ指定

MessageBoxは簡単に表示できますが、親フォームを指定しないと、意図しない位置に表示されたり、他のウィンドウの後ろに隠れたりすることがあります。

7-1. 親フォームを指定して表示する

WinFormsでは、MessageBox.Show の第1引数に親フォームを指定できます。

C#
MessageBox.Show(
this,
"処理が完了しました。",
"完了",
MessageBoxButtons.OK,
MessageBoxIcon.Information);

this を指定すると、現在のフォームを親としてMessageBoxを表示できます。

確認ダイアログでも同じです。

C#
DialogResult result = MessageBox.Show(
this,
"このデータを削除しますか?",
"削除確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);

親フォームを指定すると、MessageBoxがアプリケーションのウィンドウと関連付けられるため、ユーザーがどの画面に対するメッセージなのか分かりやすくなります。

7-2. MessageBoxが後ろに隠れる原因

MessageBoxが後ろに隠れる原因として多いのは、親ウィンドウを指定していないことです。

たとえば、別スレッドや非同期処理の完了時にMessageBoxを表示した場合、タイミングによってはアクティブなウィンドウの前に出ないことがあります。

次のように、できるだけ親フォームを指定しましょう。

C#
MessageBox.Show(
this,
"処理が完了しました。",
"完了",
MessageBoxButtons.OK,
MessageBoxIcon.Information);

また、バックグラウンド処理から直接MessageBoxを表示するのではなく、UIスレッドに戻してから表示することも重要です。

7-3. 常に前面に表示したい場合の考え方

MessageBoxを常に前面に表示したい場合でも、安易に常時最前面の指定を使うのはおすすめできません。ユーザーが別の作業をしている最中に突然前面へ出ると、操作の邪魔になることがあるためです。

まずは親フォームを指定するのが基本です。

C#
MessageBox.Show(
this,
"確認してください。",
"確認",
MessageBoxButtons.OK,
MessageBoxIcon.Information);

どうしても最前面に出したい場合は、一時的なトップレベルフォームを親にする方法もありますが、通常の業務アプリでは多用しない方がよいでしょう。

C#
using (Form topMostForm = new Form())
{
topMostForm.TopMost = true;
topMostForm.StartPosition = FormStartPosition.CenterScreen;
topMostForm.ShowInTaskbar = false;
topMostForm.Opacity = 0;

MessageBox.Show(
topMostForm,
"重要な通知です。",
"通知",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

このような方法は特殊なケース向けです。基本は、親フォームを指定して自然に表示する設計にしましょう。

7-4. 画面中央・フォーム中央に表示したい場合の注意点

標準のMessageBoxでは、表示位置を細かく指定することはできません。

「必ずフォーム中央に表示したい」「特定の座標に表示したい」といった要件がある場合、標準のMessageBoxでは限界があります。

その場合は、独自のフォームを作成してカスタムダイアログとして表示します。

C#
using (var dialog = new ConfirmDialog())
{
dialog.StartPosition = FormStartPosition.CenterParent;
DialogResult result = dialog.ShowDialog(this);
}

標準のMessageBoxは手軽さがメリットです。一方で、見た目や位置を細かく制御したい場合は、カスタムダイアログを使うのが適切です。

8. MessageBoxの詳細オプション

MessageBoxには、ボタンやアイコン以外にも、デフォルトボタンや表示オプションを指定する機能があります。

8-1. デフォルトボタンを指定する

デフォルトボタンとは、MessageBoxが表示されたときに最初から選択されているボタンです。

WinFormsでは MessageBoxDefaultButton を指定します。

C#
DialogResult result = MessageBox.Show(
"削除すると元に戻せません。\n本当に削除しますか?",
"削除確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button2);

この例では、2番目のボタンであるNoをデフォルトにしています。

削除や上書きなど、危険な操作では、誤ってEnterキーを押しても実行されないように、安全側のボタンをデフォルトにするのがよい設計です。

8-2. MessageBoxOptionsを指定する

MessageBoxOptions を使うと、表示方向やデスクトップ通知に関するオプションを指定できます。

C#
MessageBox.Show(
"メッセージを表示します。",
"タイトル",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.RightAlign);

代表的なオプションには、次のようなものがあります。

・RightAlign
・RtlReading
・DefaultDesktopOnly
・ServiceNotification

通常の日本語アプリでは、MessageBoxOptions を指定しなくても問題ありません。特殊な表示要件がある場合に使います。

8-3. 右寄せ表示や右から左への表示

メッセージを右寄せで表示したい場合は、MessageBoxOptions.RightAlign を指定します。

C#
MessageBox.Show(
"右寄せで表示するメッセージです。",
"右寄せ",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.RightAlign);

右から左に読む言語向けには、MessageBoxOptions.RtlReading を使います。

C#
MessageBox.Show(
"右から左方向の表示を想定したメッセージです。",
"RTL表示",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.RtlReading);

日本語アプリでは使用頻度は高くありませんが、多言語対応アプリでは知っておくと役立ちます。

8-4. ヘルプボタンを表示する

WinFormsのMessageBoxでは、ヘルプボタン付きのオーバーロードを使うこともできます。

C#
MessageBox.Show(
"操作方法が分からない場合は、ヘルプを確認してください。",
"ヘルプ",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
0,
true);

ただし、ヘルプボタンを表示するだけでは、分かりやすいユーザー体験になるとは限りません。現在のアプリでは、専用のヘルプ画面、Webヘルプ、ツールチップ、画面内の補足説明を使う方が自然な場合も多いです。

9. WinFormsとWPFにおけるMessageBoxの違い

C# MessageBoxを調べると、WinFormsとWPFのコードが混在していることがあります。名前が似ているため、初心者がつまずきやすいポイントです。

9-1. WinFormsのMessageBox

WinFormsでは、次の名前空間を使います。

C#
using System.Windows.Forms;

基本コードは次のとおりです。

C#
DialogResult result = MessageBox.Show(
"保存しますか?",
"確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);

if (result == DialogResult.Yes)
{
SaveData();
}

WinFormsで使う主な型は次のとおりです。

C#
MessageBoxButtons
MessageBoxIcon
MessageBoxDefaultButton
MessageBoxOptions
DialogResult

9-2. WPFのMessageBox

WPFでは、次の名前空間を使います。

C#
using System.Windows;

基本コードは次のとおりです。

C#
MessageBoxResult result = MessageBox.Show(
"保存しますか?",
"確認",
MessageBoxButton.YesNo,
MessageBoxImage.Question);

if (result == MessageBoxResult.Yes)
{
SaveData();
}

WPFで使う主な型は次のとおりです。

C#
MessageBoxButton
MessageBoxImage
MessageBoxResult
MessageBoxOptions

WPFでは、親ウィンドウを指定する場合に Window を渡せます。

C#
MessageBox.Show(
this,
"処理が完了しました。",
"完了",
MessageBoxButton.OK,
MessageBoxImage.Information);

9-3. MessageBoxButtonsとMessageBoxButtonの違い

WinFormsでは複数形の MessageBoxButtons を使います。

C#
MessageBoxButtons.YesNo

WPFでは単数形の MessageBoxButton を使います。

C#
MessageBoxButton.YesNo

名前が非常に似ているため、コピーしたコードが動かない原因になりやすいです。

WinFormsのコードにWPFの MessageBoxButton を書くとエラーになります。

C#
// WinFormsではNG
MessageBoxButton.YesNo

WPFのコードにWinFormsの MessageBoxButtons を書くのもエラーです。

C#
// WPFではNG
MessageBoxButtons.YesNo

9-4. DialogResultとMessageBoxResultの違い

WinFormsでは、戻り値として DialogResult を使います。

C#
DialogResult result = MessageBox.Show(
"削除しますか?",
"確認",
MessageBoxButtons.YesNo);

WPFでは、戻り値として MessageBoxResult を使います。

C#
MessageBoxResult result = MessageBox.Show(
"削除しますか?",
"確認",
MessageBoxButton.YesNo);

どちらも「押されたボタンを表す値」ですが、型が違うため混同しないようにしましょう。

10. MessageBoxでよくあるエラー・疑問と解決策

ここでは、C# MessageBoxを使うときによくあるエラーや疑問をまとめます。

10-1. MessageBoxが使えない・参照できない原因

MessageBox が使えない場合、まず名前空間を確認してください。

WinFormsの場合は次のusingが必要です。

C#
using System.Windows.Forms;

WPFの場合は次のusingが必要です。

C#
using System.Windows;

また、プロジェクトの種類によっては、WinFormsやWPFの参照が有効になっていないことがあります。

10-2. System.Windows.Formsが見つからない場合

.NET 5以降や.NET 6以降のプロジェクトで System.Windows.Forms が見つからない場合、プロジェクトファイルの設定を確認します。

WinFormsを使う場合は、.csproj に次のような設定が必要です。

XML
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>

コンソールアプリでWinFormsのMessageBoxを使う場合も、Windows向けのターゲットフレームワークとWinFormsの有効化が必要になることがあります。

10-3. 戻り値が思った通りにならない場合

戻り値が思った通りにならない場合は、表示しているボタンと比較している DialogResult が一致しているか確認してください。

たとえば、MessageBoxButtons.OKCancel を表示しているのに、DialogResult.Yes を判定しても一致しません。

C#
DialogResult result = MessageBox.Show(
"実行しますか?",
"確認",
MessageBoxButtons.OKCancel);

if (result == DialogResult.Yes)
{
// ここには入らない
}

この場合は、DialogResult.OK を判定します。

C#
if (result == DialogResult.OK)
{
// OKが押されたとき
}

YesNoを使うなら、次のようにします。

C#
DialogResult result = MessageBox.Show(
"実行しますか?",
"確認",
MessageBoxButtons.YesNo);

if (result == DialogResult.Yes)
{
// Yesが押されたとき
}

10-4. OKボタンと×ボタンを区別できない場合

MessageBoxでは、OKボタンと×ボタンを厳密に区別できない、またはボタン構成によって×ボタンの扱いが期待と異なる場合があります。

「OKを押した場合だけ処理したい」程度であれば、戻り値を確認すれば問題ありません。

C#
DialogResult result = MessageBox.Show(
"処理を開始しますか?",
"確認",
MessageBoxButtons.OKCancel);

if (result != DialogResult.OK)
{
return;
}

しかし、「OKを押した」「Cancelを押した」「×で閉じた」を完全に分けたい場合は、標準のMessageBoxではなく、独自フォームのカスタムダイアログを作る方が確実です。

10-5. MessageBoxのボタン文言を変更したい場合

標準のMessageBoxでは、ボタンの文字を自由に変更できません。

たとえば、標準のMessageBoxで次のようなボタンを直接表示することはできません。

・保存する
・保存しない
・あとで確認する
・削除する
・キャンセルする

標準で使えるのは、OK、Cancel、Yes、No、Retryなどの決められたボタンです。

ボタン文言を自由に変えたい場合は、カスタムダイアログを作成します。

C#
using (var dialog = new CustomConfirmDialog())
{
DialogResult result = dialog.ShowDialog(this);

if (result == DialogResult.OK)
{
// 独自ボタンが押されたときの処理
}
}

ユーザーに分かりやすいボタン名を表示したい場合は、MessageBoxにこだわらず、専用ダイアログを作ることを検討しましょう。

11. MessageBoxを使うときの設計上の注意点

MessageBoxは便利ですが、使いすぎるとユーザー体験を悪くすることがあります。必要な場面に絞って使うことが大切です。

11-1. メッセージを分かりやすく書くコツ

よいMessageBoxの本文は、短く、具体的で、次に何をすればよいかが分かります。

悪い例です。

C#
MessageBox.Show("エラーが発生しました。");

改善例です。

C#
MessageBox.Show(
"ファイルを保存できませんでした。\n保存先フォルダーの権限を確認してください。",
"保存エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);

メッセージを書くときは、次の要素を意識します。

・何が起きたのか
・なぜ問題なのか
・ユーザーは何をすればよいのか
・操作を続けてもよいのか

特にエラーや警告では、ユーザーが次の行動を取れる文章にすることが重要です。

11-2. ユーザー操作を止めすぎない

MessageBoxはモーダル表示のため、閉じるまで他の操作を止めます。そのため、何でもMessageBoxで表示すると、ユーザーにとって煩わしいアプリになります。

たとえば、次のような通知を毎回MessageBoxで出すのは避けた方がよい場合があります。

・自動保存しました
・一覧を更新しました
・検索が完了しました
・軽微な状態変更がありました

このような通知は、ステータスバー、ラベル、トースト通知、ログ表示などで代替できることがあります。

11-3. 確認ダイアログを出すべき場面

確認ダイアログを出すべきなのは、ユーザーの操作によって重要な影響がある場面です。

たとえば、次のような操作です。

・データを削除する
・変更内容を破棄する
・既存ファイルを上書きする
・大量のデータを更新する
・処理を中断すると戻せない

逆に、すぐに取り消せる操作や影響が小さい操作では、確認ダイアログを省略した方が使いやすい場合もあります。

確認ダイアログは、ユーザーを守るために使うものです。単に不安だから毎回表示する、という使い方は避けましょう。

11-4. カスタムダイアログを使うべき場面

次のような要件がある場合は、標準のMessageBoxではなくカスタムダイアログを使うべきです。

・ボタン文言を自由に変えたい
・入力欄を表示したい
・チェックボックスを表示したい
・詳細情報を折りたたみ表示したい
・デザインをアプリに合わせたい
・表示位置を細かく制御したい
・×ボタンと各ボタンを厳密に区別したい
・一定時間で自動的に閉じたい

MessageBoxは、シンプルな通知と確認に向いています。複雑な操作をさせたい場合は、専用フォームやユーザーコントロールで作る方が保守しやすくなります。

12. C# MessageBoxのよくある質問

最後に、C# MessageBoxに関するよくある質問をまとめます。

12-1. MessageBoxで入力欄は表示できる?

標準のMessageBoxでは、入力欄を表示できません。

MessageBoxでできるのは、基本的に次の要素の表示です。

・メッセージ本文
・タイトル
・ボタン
・アイコン

テキストボックスやコンボボックスを表示したい場合は、カスタムダイアログを作成します。

C#
using (var dialog = new InputDialog())
{
if (dialog.ShowDialog(this) == DialogResult.OK)
{
string inputText = dialog.InputText;
}
}

入力を受け取りたい場合は、MessageBoxではなく専用フォームを使いましょう。

12-2. ボタンの文字を「はい」「いいえ」以外に変更できる?

標準のMessageBoxでは、ボタンの文字を自由に変更できません。

MessageBoxButtons.YesNo を使えばYes/No系のボタンを表示できますが、「保存する」「破棄する」「あとで確認する」のような独自文言にはできません。

独自のボタン名が必要な場合は、カスタムダイアログを作成します。

C#
// 標準MessageBoxではなく、独自フォームを表示する
using (var dialog = new SaveConfirmDialog())
{
DialogResult result = dialog.ShowDialog(this);
}

ボタン名を具体的にするとユーザーが判断しやすくなるため、重要な操作ではカスタムダイアログの方が適している場合があります。

12-3. MessageBoxを自動で閉じることはできる?

標準のMessageBoxには、「数秒後に自動で閉じる」というシンプルな機能はありません。

自動で閉じる通知を作りたい場合は、次の方法を検討します。

・カスタムフォームを作る
・トースト通知を使う
・ステータスバーやラベルに表示する
・タイマー付きの独自ダイアログを作る

MessageBoxは、ユーザーがボタンを押して閉じることを前提にしたダイアログです。自動で消える通知には、別のUIを使う方が自然です。

12-4. 非同期処理中にMessageBoxを表示してもよい?

非同期処理中にMessageBoxを表示すること自体は可能ですが、UIスレッドで表示する必要があります。

WinFormsで async/await を使っている場合、通常はawait後にUIスレッドへ戻るため、次のように書けます。

C#
private async void btnExecute_Click(object sender, EventArgs e)
{
await Task.Run(() =>
{
// 時間のかかる処理
});

MessageBox.Show(
this,
"処理が完了しました。",
"完了",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

ただし、バックグラウンドスレッドから直接MessageBoxを表示すると、表示位置や前面表示、スレッド関連の問題が起きることがあります。

非同期処理の結果を通知する場合は、処理完了後にUI側で表示するのが基本です。

12-5. コンソールアプリでMessageBoxは使える?

Windows環境であれば、コンソールアプリからWinFormsのMessageBoxを表示することもできます。

C#
using System.Windows.Forms;

MessageBox.Show("コンソールアプリから表示しました。");

ただし、.NETの種類やプロジェクト設定によっては、System.Windows.Forms を有効にする必要があります。

.csproj の例です。

XML
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>

また、MessageBoxはWindowsデスクトップ向けの機能です。クロスプラットフォームのコンソールアプリで使う前提には向いていません。

まとめ

C# MessageBoxは、ユーザーにメッセージを表示したり、確認を求めたりするための便利な機能です。

最も基本的な表示は、次の1行で実行できます。

C#
MessageBox.Show("処理が完了しました。");

タイトル、ボタン、アイコンを指定すると、より分かりやすいメッセージになります。

C#
MessageBox.Show(
"保存が完了しました。",
"保存完了",
MessageBoxButtons.OK,
MessageBoxIcon.Information);

ユーザーが押したボタンを取得したい場合は、DialogResult を使います。

C#
DialogResult result = MessageBox.Show(
"削除しますか?",
"確認",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);

if (result == DialogResult.Yes)
{
DeleteData();
}

WinFormsでは MessageBoxButtonsMessageBoxIconDialogResult を使います。一方、WPFでは MessageBoxButtonMessageBoxImageMessageBoxResult を使います。

MessageBoxは手軽で便利ですが、使いすぎるとユーザーの操作を妨げます。単純な通知や確認にはMessageBoxを使い、入力欄、独自ボタン、細かい表示制御が必要な場合はカスタムダイアログを使うのがおすすめです。