你好,我想要“hook”另一个应用程序,以便在它关闭时关闭我的应用程序。
我不想轮询运行的进程,因为这似乎是不必要的繁琐操作,如果我想实时响应。
我相信应用程序在创建或关闭窗口时会发送消息,那么如何钩取这些消息以知道何时关闭应用程序呢?
例如,假设我的应用程序加载并检查正在运行的进程,以确保记事本已加载,如果是这样,它将保持加载状态,直到记事本关闭。当记事本关闭时,我的应用程序将某种方式知道这一点并退出...
如果可能的话,怎么实现呢?
它需要在xp,vista和win7上工作。
你好,我想要“hook”另一个应用程序,以便在它关闭时关闭我的应用程序。
我不想轮询运行的进程,因为这似乎是不必要的繁琐操作,如果我想实时响应。
我相信应用程序在创建或关闭窗口时会发送消息,那么如何钩取这些消息以知道何时关闭应用程序呢?
例如,假设我的应用程序加载并检查正在运行的进程,以确保记事本已加载,如果是这样,它将保持加载状态,直到记事本关闭。当记事本关闭时,我的应用程序将某种方式知道这一点并退出...
如果可能的话,怎么实现呢?
它需要在xp,vista和win7上工作。
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);
}
}
}
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);
}
这是非常容易实现的,因为在Windows中进程句柄可等待。使用 Process 类获取进程的句柄。
然后使用该句柄构造一个 SafeHandle,创建一个 WaitHandle。要么自己等待它,要么注册 ThreadPool.RegisterWaitForSingleObject() 以在进程关闭时获得回调。