2015-12-22 139 views
1

我必須跟蹤程序的運行時間。 該方案公開以下窗口 enter image description here按標題查找窗口窗口的標題是什麼?

同時啓動我的程序,在計時器的作用:

private void TimerCheckGroups_Tick(object sender, EventArgs e) 
{ 
    IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Execution"); 
    if (windowPtr != IntPtr.Zero) 
    Console.Beep();<-------- 
} 

但蜂鳴聲線永遠不會被擊中。 我誤解了窗口標題的含義嗎?

--ADD-- 我會盡力讓執行階段更清晰。

啓動---->啓動我的記錄器。

用戶------->啓動程序A,啓動啓動窗口C的程序B(不可見)。C具有標題執行。

當我啓動dontbyteme提出的解決方案時,只有B程序出現,所以只有1個窗口。

總之

  • 記錄器:不可見,因爲它是一個托盤程序

  • 節目A:由於它被設置爲不可見的:可見,因爲它是主程序

  • 節目B不可見

  • 程序C:不可見爲什麼?!?!?!?


--SOLUTION THANX TO JARRETT--

  • 記錄保持空閒的計時器監控流程

  • 程序的啓動,但無人問津了。然後,程序的啓動B方案

  • 當程序B是清醒的我找到窗口,並開始記錄

+1

你可以讓你的程序啓動執行程序嗎?如果您必須手動啓動這兩個程序,您的時間將不正確。另外,通過讓您的跟蹤程序啓動執行程序,您可以確切知道何時啓動。 –

+0

不,我不能。窗口執行程序由用戶啓動。雖然我的程序是一個記錄器,所以它在窗口啓動時啓動。 – Patrick

+0

根據編組的舒適程度,您是否查看過'EnumWindows我用它來查找打開的窗口。它在user32.dll中。這會給你打開的窗口,但不會知道一個新的程序已啓動。 –

回答

1

以下問題解決了如何找出程序何時啓動。 Detecting the launch of a application此外,您可以使用DLL導入並使用EnumWindows枚舉機器上的窗口。示例pInvokes將幫助您列出。

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam); 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount); 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern int GetWindowTextLength(IntPtr hWnd); 
    [DllImport("user32.dll")] 
    private static extern bool IsWindowVisible(IntPtr hWnd); 
+0

所以這個問題與時間有關,請看我的編輯,因爲我已經按照你的提示去解決問題。我希望你發佈一個解決方案,說這個問題與同時啓動這兩個程序有關。我認爲你應得的。 – Patrick

0

您可以通過每個窗口中運行嘗試獲得的窗口,並比較標題:

foreach(Window window in Application.Current.Windows) 
    { 
     if(window.Title == "Execution") 
     { 
      Console.Beep(); 
      // ... 
     } 
    } 

Title財產是你所說的Caption

+0

唉不行,請看我的編輯。 – Patrick