質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • C#

    7066questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ダイアログ

    12questions

    ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

[C#]ダイアログボックスがボタン押下せずに消える

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,035

mitts

score 11

前提・実現したいこと

C#のコンソールアプリケーションでダイアログボックスを表示させる機能を実装中です

発生している問題・エラーメッセージ

現れたダイアログボックスがOKボタンを押下せずとも消える状態に困っています。

該当のソースコード

        private string errorMessage = "認識されない文字が書かれています。";
        public void DisplayErrorDialog()
        {
            DialogResult result =  MessageBox.Show(errorMessage,
                "エラー",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error);
            if(result == DialogResult.OK)
            {
                //プログラムの終了  
                Environment.Exit(0);
            }

試したこと

特にスレッドやタスクを組んだりしてはいないです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

手元でコンソールアプリを作って、ご提示のコードをそのまま実行してみましたが、
こちらの環境ではおっしゃる現象は再現しませんでした。

開発環境や実行環境を明示されていないのでなんともいえませんが、
本当にご提示のコードだけで同現象になりますか?

  • スレッドやタスクは使っていないとおっしゃっていますが、
    一番可能性があるのはMainでないスレッドから呼ばれていることかなと思いました。

  • ダイアログを閉じるより先に元のアプリが終了されてしまっている場合などは
    当然ダイアログも勝手に閉じることになります。

  • アプリケーションのMainメソッドに [STAThread] 属性を付与してもだめでしょうか

  • 前の方がおっしゃっているように、実はMessageBoxでなく自作のFormだとかでしたら、
    Show()メソッドで呼び出した際や、自分でDialogResultの値を設定した場合などに同現象が起こりえます。

  • ちょっと考えにくいですが、他のセキュリティソフト等でダイアログを勝手に閉じてしまうようなものが
    もしかしたらあるかもしれません。

あとは、コンソールアプリでMessageBoxを表示するという行為自体がイレギュラーではあるので、
可能ならばコンソールへのメッセージ出力を代替とするのが良いかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/24 14:18

    確認しましたが提示くださった可能性の上4つには該当しませんでした。
    最後の他のソフトでダイアログを閉じるようなことを行っていないか検討してみます
    回答ありがとうございました

    キャンセル

+1

Show() でなく ShowDialog() を使って下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/24 12:29

    form と間違えました。
    すみません。

    キャンセル

  • 2017/01/24 12:33

    問題はこの部分ではなく、呼び出し元にあると思います。

    キャンセル

  • 2017/01/24 14:19

    回答ありがとうございます
    私の実行環境に原因があるようです

    キャンセル

  • 2017/01/24 14:28

    実行環境というより、この関数を呼び出しているスレッドの問題だと思います。
    もしかして、メッセージループしていないのではないですか?

    キャンセル

  • 2017/01/24 14:39 編集

    言葉が足りなくて誤解させてしまいました
    自分のPCのVisualStudio上で実行した場合は問題なく動作します(ダイアログボックスが表示されて消えたりしない)
    自分のPC上でこのプロジェクトのexeを実行した場合も問題なく動作します。
    問題が起こるのは、このexeを別のWindows PC上で実行した場合です。ダイアログボックスが一瞬現れてすぐ消えるような挙動をする状態です。

    キャンセル

  • 2017/01/24 14:46

    なるほどそうでしたか。では環境に依存しているのですね。
    もし exe を直接エクスプローラーか何かで起動しているのでしたら、まずコマンドプロンプトを立ち上げて実行してみると、もしかしたら何かエラーメッセージが出ているかもしれません。
    相手先の PC に VisualStudio をインストールしてデバッグできるのが一番いいのですが、できない場合もありますよね。
    お目汚し失礼しました。

    キャンセル

  • 2017/01/24 15:09

    とんでもないです。丁寧な回答ありがとうございました。

    キャンセル

+1

errorMessageとDisplayErrorDialogをstaticにしたらどうなりますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/24 14:19

    挙動はかわりませんでした

    キャンセル

+1

    class Program {
        public static void DisplayErrorDialog() {
            string errorMessage = "認識されない文字が書かれています。";
            DialogResult result = MessageBox.Show(errorMessage,
                "エラー",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error);
            if (result == DialogResult.OK) {
                //プログラムの終了  
                Environment.Exit(0);
            }
        }
        static void Main(string[] args) {
            DisplayErrorDialog();
        }
    }


普通に動作しちゃいましたが…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7066questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ダイアログ

    12questions

    ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。