【问题标题】:Application cancelling shutdown应用程序取消关闭
【发布时间】:2012-01-23 09:55:10
【问题描述】:

我遇到了一个似乎取消关闭或重新启动计算机的应用程序的问题。 我认为这是因为我捕获了表单关闭事件并像这样取消它:

private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!AllowApplicationClose)
    {
        e.Cancel = true;
        this.WindowState = FormWindowState.Minimized;
    }
}

我这样做是为了让关闭按钮最小化到任务栏。我确实希望能够在不退出应用程序的情况下重新启动。有一个更好的方法吗?或者知道windows是否正在关闭应用程序的方法?

编辑:感谢您的回答。对不起,我只能选择一个正确的,我只选择了最上面的一个。再次感谢!

【问题讨论】:

    标签: c# .net c#-4.0


    【解决方案1】:

    您可以使用CloseReason 来检测用户是否正在关闭表单,或者更好(在您的情况下)使用SystemEvents-class 在系统尝试注销或关闭/重启时获取事件所以你也可以在应用程序最小化时关闭它。

    【讨论】:

      【解决方案2】:

      先检查e.CloseReason;只有在用户发起时才取消:CloseReason.UserClosing

      请参阅此处了解您可以使用的其他值:CloseReason (MSDN)

      【讨论】:

        【解决方案3】:

        检查事件参数的CloseReason,如果是WindowsShutDownTaskManagerClosing,则不执行任何操作。

        【讨论】:

          【解决方案4】:

          使用线程定时器程序然后下面的程序分别关闭windows进程。

          public void Computer_Shutdown()
                  {
                      if (this.checkBox.Checked)
                      {
                          System.Diagnostics.Process[] processes = 
                             System.Diagnostics.Process.GetProcesses();
          
                          foreach (System.Diagnostics.Process 
                                     processParent in processes)
                          {
                              System.Diagnostics.Process[] processNames = 
                                           System.Diagnostics.Process.
                                           GetProcessesByName
                                           (processParent.ProcessName);
          
                              foreach (System.Diagnostics.Process 
                                      processChild in processNames)
                              {
                                  try
                                  {
                                      System.IntPtr hWnd = 
                                             processChild.MainWindowHandle;
          
                                      if (IsIconic(hWnd))
                                      {
                                          ShowWindowAsync(hWnd, SW_RESTORE);
                                      }
          
                                      SetForegroundWindow(hWnd);
          
                                      if (!(processChild.
                                         MainWindowTitle.Equals(this.Text)))
                                      {
                                          processChild.CloseMainWindow();
                                          processChild.Kill();
                                          processChild.WaitForExit();
                                      }
                                  }
                                  catch (System.Exception exception)
                                  {
          
                                  }
                              }
                          }
                      }
          

          【讨论】:

          • 这将结束进程,我认为这不是原始发布者(OP)想要做的。他有兴趣在 Windows 关闭时不取消他的应用程序关闭。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          • 2018-07-06
          • 1970-01-01
          • 2012-12-25
          相关资源
          最近更新 更多