我想知道如果我能得到任何消息,說一個特定的開放窗口已經過去了嗎?如何知道窗口是否已經走了?
清除:我打開記事本,鍵入一些文本,然後關閉它。我希望我的C#程序顯示一條消息,指出我的窗口已經消失。我是C#的新手,所以請建議我可能需要查看的一個或多個類,或者更好地提供一個簡短的示例來演示主要任務。我非常感謝你的幫助。
我想知道如果我能得到任何消息,說一個特定的開放窗口已經過去了嗎?如何知道窗口是否已經走了?
清除:我打開記事本,鍵入一些文本,然後關閉它。我希望我的C#程序顯示一條消息,指出我的窗口已經消失。我是C#的新手,所以請建議我可能需要查看的一個或多個類,或者更好地提供一個簡短的示例來演示主要任務。我非常感謝你的幫助。
骯髒的,但工作方式將與一個定時輪詢當前運行的進程,將該列表與您之前進行的輪詢中運行的進程進行比較。
首先,添加這樣的類成員存儲過程供以後比較:
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 function。
當這種停止查找窗口,然後在窗口已經
由於@Richard指出需要FindWindow()
觀看任何窗口。在記事本的情況下,您可以更簡單地做到這一點,因爲一旦窗口消失,記事本進程就會終止。
您可以Process.Start()
啓動記事本,並使用返回Process
對象的Exited
事件來運行代碼時,記事本完成:
Process notepad = Process.Start("Notepad", "c:\temp\text.txt");
notepad.Exited += MyExitEventHandler;
謝謝,但我不打算從程序本身開始記事本,我的意思是檢查所有打開的窗口,然後我想你的解決方案處理退出事件看起來非常有前途,我會嘗試一下,再次感謝安德斯 –
如果你可以在* process * level上工作(這意味着你不想要例如當程序中的對話被關閉時),你可以使用'Process.GetProcesses'來獲得所有當前正在運行的進程的列表 –
當然這依賴於只有一個窗口的進程,這樣窗口的關閉是同義詞隨着過程的終止,但如果你能保證使用過程更簡單 –
繁忙的等待是處理鎖定的一種非常糟糕的方式。 – none
謝謝你的意見和建議 –
@none鎖?你指的是哪個鎖? –