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

标签 c# .net-4.0 winapi

嗨 我想“ Hook ”另一个应用程序,以便在它关闭时我可以关闭我的应用程序。

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

我相信应用程序在创建或关闭时会在窗口内发送消息等,我怎样才能知道它何时关闭?

例如,假设我的应用加载检查正在运行的进程以确保记事本已加载,如果是这样,它会保持加载状态直到记事本关闭。当记事本关闭时,我的应用程序如何知道这一点并退出...

这可能吗?

它需要在 xp vista 和 win7 上工作

最佳答案

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

这里是一个例子,没有使用单独的线程

Process[] processes = Process.GetProcessesByName("notepad");
if (processes.Length > 0)
{
  processes[0].WaitForExit();
}

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

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);
    }
  }
}

以下控制台代码是如何使用上述内容的示例。当然,这在 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);
}

关于c# - 观看另一个应用程序,如果它关闭关闭我的应用程序(不轮询)c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119069/

相关文章:

c++ - Qt 需要将 Qt 应用程序带到前台,从 win32 应用程序调用

c# - 即使使用 ConfigureAwait(false),HttpClient 的 PostAsync 方法也会阻塞

c# - 异步加载网络图像

c# - 使用 CheckBoxListFor Extension 获取 "Value cannot be null"异常

c++ - 禁用特定进程的注册表访问 (WinAPI)

c++ - 如何删除 Windows 10 版本 1809 剪贴板历史记录?

c# - 向 Entity Framework 模型添加属性

.net - 我应该使用什么 gacutil.exe?

c# - BindingSource.ResetBindings 不工作,除非 "true"通过

c# - Server.MapPath 问题?