Отмена закрытия приложения - PullRequest
3 голосов
/ 23 января 2012

У меня проблема с приложением, которое, кажется, отменяет выключение или перезагрузку моего компьютера.Я думаю, это потому, что я фиксирую событие закрытия формы и отменяю его следующим образом:

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

Я делаю это так, чтобы кнопка закрытия просто свернулась на панели задач.Я действительно хочу иметь возможность перезагрузить, не выходя из приложения, хотя.Есть лучший способ сделать это?Или способ узнать, закрывает ли приложение окна?

РЕДАКТИРОВАТЬ: Спасибо за ответы.Извините, я мог выбрать только один, как правильно, я просто пошел с лучшим.Еще раз спасибо!

Ответы [ 4 ]

2 голосов
/ 23 января 2012

Проверка e.CloseReason первая; только отмена, если это инициировано пользователем: CloseReason.UserClosing.

Смотрите здесь другие значения, которые вы можете использовать: CloseReason (MSDN)

2 голосов
/ 23 января 2012

Вы можете использовать CloseReason, чтобы определить, закрыта ли форма пользователем или лучше (в вашем случае), использовать класс SystemEvents, чтобы получить событиекогда система пытается выйти из системы или завершить работу / перезапустить ее, поэтому вы также можете закрыть приложение, когда оно свернуто.

1 голос
/ 23 января 2012

Проверьте CloseReason аргументов события и ничего не делайте, если это WindowsShutDown или TaskManagerClosing.

0 голосов
/ 23 января 2012

Используйте процедуру с поточным таймером, а затем описанную ниже процедуру, чтобы закрыть процессы 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)
                        {

                        }
                    }
                }
            }
...