如何知道一个窗口是否已经消失

本文关键字:是否 窗口 消失 一个 何知道 | 更新日期: 2023-09-27 18:05:25

我想知道我是否能得到任何消息,说一个特定的打开的窗口已经消失了

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

如何知道一个窗口是否已经消失

正如@Richard指出的那样,您需要FindWindow()来监视任何窗口。在记事本的情况下,您可以做得更简单,因为记事本进程在窗口消失后立即终止。

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

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

比较当前运行的进程列表和之前轮询中运行的进程

首先,添加这样的类成员来存储以后比较的过程:

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

只要你的应用程序还在运行,它就会继续轮询。

您需要使用interop来完成此操作。创建一个调用FindWindow win32函数的计时器。

当这个停止查找窗口时,说明窗口已经消失