2

ユーザーがアプリを閉じようとしているときにダイアログを表示したいのですが(赤いウィンドウが交差し、フォームのボタン)、ウィンドウがシャットダウンしているとき、このダイアログはシャットダウンをブロックしているので、ウィンドウがシャットダウンしているときにアプリで検出して続行したいダイアログなし。これが私のコードです

フォームのロード後、クローズイベントをキャッチします。

this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        switch (e.CloseReason)
        {
            case CloseReason.UserClosing:
                if (MessageBox.Show("Do you want to exit the application?", "Your App", MessageBoxButtons.YesNo) == DialogResult.No)
                    {
                        e.Cancel = true;
                    }
                break;
            case CloseReason.WindowsShutDown:
                e.Cancel = false; //this is propably dumb
                break;
            default:
                break;
        }
    }

ただし、ユーザーがアプリを閉じると、ダイアログが2回表示されます。最初のダイアログは何でもします。2番目のダイアログの後にアクションが実行されます。Windowsがシャットダウンしているときにダイアログを1回だけ閉じてダイアログを表示しないようにするにはどうすればよいですか(Windowsはアプリが閉じるのを待っているため)?

4

1 に答える 1

4

このコードを書くためのより良い方法(私の意見)は、フォームイベントをサブスクライブするのではなく、使用可能なオーバーライドメソッドを使用することです。

protected override void OnFormClosing(FormClosingEventArgs e)
{
  switch (e.CloseReason)
  {
    case CloseReason.UserClosing:
      if (MessageBox.Show("Do you want to exit the application?", "Your App", MessageBoxButtons.YesNo) == DialogResult.No)
      {
        e.Cancel = true;
      }
      break;
    case CloseReason.WindowsShutDown:
      e.Cancel = false; //this is propably dumb
      break;
    default:
      break;
    }

  base.OnFormClosing(e);
}

if (e.CloseReason == CloseReason.UserClosing)現在の形式に基づいて、switchステートメント の代わりに使用することを検討することをお勧めします。e.CancelデフォルトではすでにFalseになっているため、明示的に設定する必要はありません。

于 2013-01-23T16:49:24.037 に答える