观看另一个应用程序,如果它关闭关闭我的应用程序(没有轮询)c#

Adr*_*ian 3 c# winapi .net-4.0

嗨,我想"挂钩"另一个应用程序,所以当它关闭时,我可以关闭我的应用程序.

如果我想实时响应,我不想轮询正在运行的进程,因为这似乎是不必要的密集型.

我相信应用程序在创建或关闭时会在窗口内发送消息等,如何将其挂钩以了解它何时关闭?

例如,假设我的应用程序加载检查正在运行的进程以确保加载记事本,如果是,它将保持加载直到记事本关闭.作为记事本关闭我的应用程序有些人知道这个并退出...

这有可能,如果是这样的话?

它需要在xp vista和win7上运行

Chr*_*lor 9

如果您有正在运行的应用程序的Process实例,则可以使用Process.WaitForExit,它将阻塞直到该进程关闭.当然你可以将WaitForExit放在另一个线程中,这样你的主线程就不会阻塞.

这是一个例子,不使用单独的线程

Process[] processes = Process.GetProcessesByName("notepad");
if (processes.Length > 0)
{
  processes[0].WaitForExit();
}
Run Code Online (Sandbox Code Playgroud)

这是一个使用线程来监视进程的简单版本.

public static class ProcessMonitor
{
  public static event EventHandler ProcessClosed;

  public static void MonitorForExit(Process process)
  {
    Thread thread = new Thread(() =>
    {
      process.WaitForExit();
      OnProcessClosed(EventArgs.Empty);
    });
    thread.Start();      
  }

  private static void OnProcessClosed(EventArgs e)
  {
    if (ProcessClosed != null)
    {
      ProcessClosed(null, e);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以下控制台代码是如何使用上述代码的示例.当然,这在WPF或WinForms应用程序中同样有效,但请记住,对于UI,您无法直接从事件回调更新UI,因为它在与UI线程的单独线程中运行.这里有很多关于stackoverflow的例子,解释了如何从非UI线程更新WinForms和WPF的UI.

static void Main(string[] args)
{
  // Wire up the event handler for the ProcessClosed event
  ProcessMonitor.ProcessClosed += new EventHandler((s,e) =>
  {
    Console.WriteLine("Process Closed");
  });

  Process[] processes = Process.GetProcessesByName("notepad");
  if (processes.Length > 0)
  {
    ProcessMonitor.MonitorForExit(processes[0]);
  }
  else
  {
    Console.WriteLine("Process not running");        
  }
  Console.ReadKey(true);
}
Run Code Online (Sandbox Code Playgroud)

  • @SaeedAlg,WaitForExit在WaitHandle上调用WaitOne,因为它是ProcessWaitHandle的一个实例.所以基本上使用等待进程句柄的操作系统功能在进程关闭时发出信号. (2认同)