2011-08-14 48 views
2

我想知道如果我能得到任何消息,說一個特定的開放窗口已經過去了嗎?如何知道窗口是否已經走了?

清除:我打開記事本,鍵入一些文本,然後關閉它。我希望我的C#程序顯示一條消息,指出我的窗口已經消失。我是C#的新手,所以請建議我可能需要查看的一個或多個類,或者更好地提供一個簡短的示例來演示主要任務。我非常感謝你的幫助。

回答

1

骯髒的,但工作方式將與一個定時輪詢當前運行的進程,將該列表與您之前進行的輪詢中運行的進程進行比較。

首先,添加這樣的類成員存儲過程供以後比較:

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

只要您的應用程序將運行,它將保持輪詢。

1

您需要使用interop來完成此操作。創建一個計時器,調用FindWindow win32 function

當這種停止查找窗口,然後在窗口已經

+3

繁忙的等待是處理鎖定的一種非常糟糕的方式。 – none

+0

謝謝你的意見和建議 –

+1

@none鎖?你指的是哪個鎖? –

4

由於@Richard指出需要FindWindow()觀看任何窗口。在記事本的情況下,您可以更簡單地做到這一點,因爲一旦窗口消失,記事本進程就會終止。

您可以Process.Start()啓動記事本,並使用返回Process對象的Exited事件來運行代碼時,記事本完成:

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

謝謝,但我不打算從程序本身開始記事本,我的意思是檢查所有打開的窗口,然後我想你的解決方案處理退出事件看起來非常有前途,我會嘗試一下,再次感謝安德斯 –

+0

如果你可以在* process * level上工作(這意味着你不想要例如當程序中的對話被關閉時),你可以使用'Process.GetProcesses'來獲得所有當前正在運行的進程的列表 –

+0

當然這依賴於只有一個窗口的進程,這樣窗口的關閉是同義詞隨着過程的終止,但如果你能保證使用過程更簡單 –

相關問題