Process.CloseMainWindow Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Закрывает процесс, имеющий пользовательский интерфейс, посылая сообщение о закрытии главному окну процесса.
public:
bool CloseMainWindow();
public bool CloseMainWindow ();
member this.CloseMainWindow : unit -> bool
Public Function CloseMainWindow () As Boolean
Возвращаемое значение
Значение true
, если сообщение о закрытии было успешно отправлено; false
, если связанный процесс не имеет главного окна или если главное окно отключено (например, если отображается модальное диалоговое окно).
Исключения
Примеры
В следующем примере запускается экземпляр Блокнота. Затем он извлекает данные об использовании физической памяти связанным процессом с интервалом в 2 секунды в течение не более 10 секунд. В примере определяется, завершается ли процесс до истечения 10 секунд. В примере процесс закрывается, если он по-прежнему выполняется через 10 секунд.
#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
Комментарии
При выполнении процесса цикл сообщений находится в состоянии ожидания. Цикл сообщений выполняется каждый раз, когда операционная система отправляет в процесс сообщение Windows. Вызов CloseMainWindow отправляет запрос на закрытие окна main, который в правильно сформированном приложении закрывает дочерние окна и отменяет все выполняемые циклы сообщений для приложения. Запрос на выход из процесса путем вызова CloseMainWindow не приводит к принудительному завершению работы приложения. Приложение может запросить проверку пользователя перед выходом или отказаться от выхода. Чтобы принудительно завершить работу приложения, используйте Kill метод . Поведение пользователя идентично поведению CloseMainWindow пользователя, закрывающего окно main приложения с помощью системного меню. Таким образом, запрос на завершение процесса путем закрытия окна main не приводит к немедленному завершению работы приложения.
Данные, измененные процессом, или ресурсы, выделенные для процесса, могут быть потеряны при вызове Kill. Kill вызывает аномальное завершение процесса и должно использоваться только при необходимости. CloseMainWindow обеспечивает упорядоченное завершение процесса и закрытие всех окон, поэтому это предпочтительнее для приложений с интерфейсом. В случае CloseMainWindow сбоя можно использовать для Kill завершения процесса. Kill — единственный способ завершить процессы, у которых нет графических интерфейсов.
Можно вызывать Kill и CloseMainWindow только для процессов, запущенных на локальном компьютере. Невозможно привести к завершению процессов на удаленных компьютерах. Вы можете просматривать сведения только о процессах, выполняющихся на удаленных компьютерах.