如何知道窗户是否已经消失?

时间:2011-08-14 09:12:58

标签: c# windows

我想知道我是否可以得到任何消息说特定的打开窗口已经消失了?

清除:我打开一个记事本,输入一些文字,然后关闭它。我希望我的C#程序显示一条消息,说明我的窗口已经消失了。我是C#的新手,所以请建议我可能需要研究的一个或多个课程,或者更好地提供一个简短的样本来演示主要任务。我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:4)

正如@Richard指出,您需要FindWindow()来观看任何窗口。对于记事本,您可以更简单地执行此操作,因为一旦窗口消失,记事本进程就会终止。

您可以使用Process.Start()启动记事本,并在返回的Exited对象上使用Process事件,以便在记事本完成时运行代码:

Process notepad = Process.Start("Notepad", "c:\temp\text.txt");
notepad.Exited += MyExitEventHandler;

答案 1 :(得分:1)

您需要使用互操作才能执行此操作。创建一个调用FindWindow win32 function的计时器。

当这停止找到窗口时,窗口已经消失

答案 2 :(得分:1)

肮脏但有效的方法是使用Timer轮询当前正在运行的进程,将列表与您之前轮询中运行的进程进行比较。

首先,添加此类成员以存储稍后进行比较的进程:

List<string> lastRunningProcesses = new List<string>();

然后,开始轮询有这样的代码:

System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500; //half a second
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();

最后这是轮询和比较代码:

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    List<string> currentlyRunningProcesses = System.Diagnostics.Process.GetProcesses().ToList().ConvertAll(p => p.ProcessName);
    if (lastRunningProcesses.Count > 0)
    {
        List<string> closedProcesses = lastRunningProcesses.FindAll(p => !currentlyRunningProcesses.Contains(p));
        if (closedProcesses.Count > 0)
            MessageBox.Show(string.Format("{0} process(es) have been closed:\n{1}", closedProcesses.Count, string.Join("\n", closedProcesses)));
    }
    lastRunningProcesses = currentlyRunningProcesses;
}

只要您的应用程序运行,它就会继续进行轮询。