Process.CloseMainWindow Метод

Определение

Закрывает процесс, имеющий пользовательский интерфейс, посылая сообщение о закрытии главному окну процесса.Closes a process that has a user interface by sending a close message to its main window.

public:
 bool CloseMainWindow();
public bool CloseMainWindow ();
member this.CloseMainWindow : unit -> bool
Public Function CloseMainWindow () As Boolean

Возвращаемое значение

Boolean

Значение true, если сообщение о закрытии было успешно отправлено; false, если связанный процесс не имеет главного окна или если главное окно отключено (например, если отображается модальное диалоговое окно).true if the close message was successfully sent; false if the associated process does not have a main window or if the main window is disabled (for example if a modal dialog is being shown).

Исключения

Этот процесс уже завершился.The process has already exited.

-или--or- Нет процессов, связанных с этим объектом Process.No process is associated with this Process object.

Примеры

В следующем примере запускается экземпляр блокнота.The following example starts an instance of Notepad. Затем он получает сведения об использовании физической памяти для связанного процесса с интервалом в 2 секунды в течение не более 10 секунд.It then retrieves the physical memory usage of the associated process at 2 second intervals for a maximum of 10 seconds. Пример определяет, завершается ли процесс до 10 секунд.The example detects whether the process exits before 10 seconds have elapsed. В этом примере процесс закрывается, если он по-прежнему выполняется через 10 секунд.The example closes the process if it is still running after 10 seconds.

#using <System.dll>

using namespace System;
using namespace System::Diagnostics;
using namespace System::Threading;
int main()
{
   try
   {
      Process^ myProcess;
      myProcess = Process::Start(  "Notepad.exe" );
      
      // Display physical memory usage 5 times at intervals of 2 seconds.
      for ( int i = 0; i < 5; i++ )
      {
         if (  !myProcess->HasExited )
         {
            
            // Discard cached information about the process.
            myProcess->Refresh();
            
            // Print working set to console.
            Console::WriteLine( "Physical Memory Usage : {0}", myProcess->WorkingSet.ToString() );
            
            // Wait 2 seconds.
            Thread::Sleep( 2000 );
         }
         else
         {
            break;
         }

      }
      myProcess->CloseMainWindow();
      
      // Free resources associated with process.
      myProcess->Close();
   }
   catch ( Exception^ e ) 
   {
      Console::WriteLine( "The following exception was raised: " );
      Console::WriteLine( e->Message );
   }

}

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Threading;

namespace ProcessSample
{
    class MyProcessClass
    {
        public static void Main()
        {
            try
            {
                using (Process myProcess = Process.Start("Notepad.exe"))
                {
                    // Display physical memory usage 5 times at intervals of 2 seconds.
                    for (int i = 0; i < 5; i++)
                    {
                        if (!myProcess.HasExited)
                        {
                            // Discard cached information about the process.
                            myProcess.Refresh();
                            // Print working set to console.
                            Console.WriteLine($"Physical Memory Usage: {myProcess.WorkingSet}");
                            // Wait 2 seconds.
                            Thread.Sleep(2000);
                        }
                        else
                        {
                            break;
                        }
                    }

                    // Close process by sending a close message to its main window.
                    myProcess.CloseMainWindow();
                    // Free resources associated with process.
                    myProcess.Close();
                }
            }
            catch (Exception e) when (e is Win32Exception || e is FileNotFoundException)
            {
                Console.WriteLine("The following exception was raised: ");
                Console.WriteLine(e.Message);
            }
        }
    }
}
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.IO
Imports System.Threading

Namespace Process_Sample
    Class MyProcessClass

        Public Shared Sub Main()
            Try
                Using myProcess = Process.Start("Notepad.exe")
                    ' Display physical memory usage 5 times at intervals of 2 seconds.
                    Dim i As Integer
                    For i = 0 To 4
                        If Not myProcess.HasExited Then

                            ' Discard cached information about the process.
                            myProcess.Refresh()
                            ' Print working set to console.
                            Console.WriteLine($"Physical Memory Usage: {myProcess.WorkingSet}")
                            ' Wait 2 seconds.
                            Thread.Sleep(2000)
                        Else
                            Exit For
                        End If

                    Next i

                    ' Close process by sending a close message to its main window.
                    myProcess.CloseMainWindow()
                    ' Free resources associated with process.
                    myProcess.Close()
                End Using
            Catch e As Exception When TypeOf e Is Win32Exception Or TypeOf e Is FileNotFoundException
                Console.WriteLine("The following exception was raised: ")
                Console.WriteLine(e.Message)
            End Try
        End Sub
    End Class
End Namespace 'Process_Sample

Комментарии

При выполнении процесса его цикл обработки сообщений находится в состоянии ожидания.When a process is executing, its message loop is in a wait state. Цикл обработки сообщений выполняется каждый раз, когда операционная система отправляет сообщение Windows в процесс.The message loop executes every time a Windows message is sent to the process by the operating system. Вызов CloseMainWindow отправляет запрос на закрытие главного окна, которое в правильно сформированном приложении закрывает дочерние окна и отменяет все выполняющиеся циклы обработки сообщений для приложения.Calling CloseMainWindow sends a request to close the main window, which, in a well-formed application, closes child windows and revokes all running message loops for the application. Запрос на выход из процесса путем вызова не CloseMainWindow заставляет приложение завершить работу.The request to exit the process by calling CloseMainWindow does not force the application to quit. Приложение может запросить проверку пользователя перед выходом или отказаться от его завершения.The application can ask for user verification before quitting, or it can refuse to quit. Чтобы принудительно завершить работу приложения, используйте Kill метод.To force the application to quit, use the Kill method. Поведение аналогично тому CloseMainWindow , как пользователь закрывает главное окно приложения с помощью системного меню.The behavior of CloseMainWindow is identical to that of a user closing an application's main window using the system menu. Таким образом, запрос на завершение процесса путем закрытия главного окна не заставляет приложение немедленно завершить работу.Therefore, the request to exit the process by closing the main window does not force the application to quit immediately.

Данные, измененные процессом или ресурсами, выделенными для процесса, могут быть потеряны при вызове Kill .Data edited by the process or resources allocated to the process can be lost if you call Kill. Kill вызывает аварийное завершение процесса и должно использоваться только при необходимости.Kill causes an abnormal process termination, and should be used only when necessary. CloseMainWindow включает упорядоченное завершение процесса и закрывает все окна, поэтому оно является предпочтительным для приложений с интерфейсом.CloseMainWindow enables an orderly termination of the process and closes all windows, so it is preferable for applications with an interface. CloseMainWindowВ случае сбоя можно использовать Kill для завершения процесса.If CloseMainWindow fails, you can use Kill to terminate the process. Kill является единственным способом завершения процессов, не имеющих графических интерфейсов.Kill is the only way to terminate processes that do not have graphical interfaces.

Можно вызывать Kill и CloseMainWindow только для процессов, запущенных на локальном компьютере.You can call Kill and CloseMainWindow only for processes that are running on the local computer. Нельзя вызвать завершение процессов на удаленных компьютерах.You cannot cause processes on remote computers to exit. Можно просматривать только сведения о процессах, запущенных на удаленных компьютерах.You can only view information for processes running on remote computers.

Применяется к