2010-11-07 49 views
3

嗨 我想“钩”另一个应用程序,所以当它关闭时,我可以关闭我的应用程序。观看另一个应用程序,如果它关闭关闭我的应用程序(无需轮询)c#

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

我相信应用程序在窗口创建或关闭时发出消息等我怎样才能知道它什么时候关闭?

例如可以说我的应用程序加载检查正在运行的进程,以确保记事本已加载,如果存在,它会一直加载,直到记事本关闭。当记事本关闭我的应用程序一些如何知道这一点,并退出...

这是可能的,如果是这样怎么样?

它需要如果有流程实例可以使用Process.WaitForExit这将阻止,直到该进程被关闭正在运行的应用程序在XP Vista和Win7

回答

9

工作。当然,你可以把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); 
} 
+0

WaitForExit steel使用轮询 – 2010-11-07 18:59:14

+2

@SaeedAlg,WaitForExit在进程的WaitHandle上调用WaitOne,通常它是ProcessWaitHandle的一个实例。因此,基本上使用等待进程句柄的操作系统功能在进程关闭时发出信号。 – 2010-11-07 19:06:51

+0

嗨克里斯感谢这一点我是新来的C#,迄今为止避免使用多个线程!猜我现在需要看看... 任何机会,我会如何在另一个线程上做这件事,并提出一个事件... – Adrian 2010-11-07 19:11:28

1

这很容易,因为在Window的一个进程句柄是可以等待的。使用Process类来获取进程的句柄。

然后用它来构造一个SafeHandle,创建一个WaitHandle。您可以自己等待,或者在ThreadPool.RegisterWaitForSingleObject()注册以在流程关闭时接听电话。

+0

这是一个好主意。请记住,当WaitHandle派生类应该复制进程句柄,否则事情将非常不可靠,这将需要一些额外的P/Invoke到kernel32 DuplicteHandle方法。 – 2010-11-07 19:15:36