Process.CloseMainWindow 方法

定义

通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程。

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

返回

如果成功发送了关闭消息,则为 true;如果关联进程没有主窗口或禁用了主窗口(例如,如果当前显示模式对话框),则为 false

例外

已经退出该进程。

没有与此 Process 对象关联的进程。

示例

以下示例启动记事本的实例。 然后,它每隔 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 方法。 的行为与使用系统菜单关闭应用程序的main窗口的用户的行为CloseMainWindow相同。 因此,通过关闭main窗口退出进程的请求不会强制应用程序立即退出。

如果调用 Kill,则进程编辑的数据或分配给进程的资源可能会丢失。 Kill 导致异常进程终止,仅在必要时才应使用。 CloseMainWindow 允许有条不紊地终止进程并关闭所有窗口,因此最好是具有接口的应用程序。 如果 CloseMainWindow 失败,可以使用 Kill 终止进程。 Kill 是终止没有图形界面的进程的唯一方法。

只能为在本地计算机上运行的进程调用 KillCloseMainWindow 。 不能导致远程计算机上的进程退出。 只能查看远程计算机上运行的进程的信息。

适用于