我想知道我是否可以得到任何消息说特定的打开窗口已经消失了?
清除:我打开一个记事本,输入一些文字,然后关闭它。我希望我的C#程序显示一条消息,说明我的窗口已经消失了。我是C#的新手,所以请建议我可能需要研究的一个或多个课程,或者更好地提供一个简短的样本来演示主要任务。我非常感谢你的帮助。
答案 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;
}
只要您的应用程序运行,它就会继续进行轮询。