2013-04-15 62 views
0

我們有第三方winforms軟件,我們需要作爲批處理運行 我需要監視某個進程的某個表單(我們同時運行多個進程)是否顯示。收聽其他進程窗口

我已經使用這種方法來獲得所有窗口句柄的處理

public IEnumerable<int> EnumerateProcessWindowHandles(int processId) 
{ 
    var handles = new List<IntPtr>(); 
    try 
    { 

     foreach (ProcessThread thread in Process.GetProcessById(processId).Threads) 
      Win32.EnumThreadWindows(thread.Id, 
       (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero); 

    } 
    catch(Exception e) {} 
    return handles.Select(h => (int)h); 
} 

然後該方法從HWND

public string GetTitle(int hwnd) 
{ 
    int length = Win32.SendMessage((IntPtr)hwnd, Win32.WM_GETTEXTLENGTH, 0, IntPtr.Zero); 
    var sb = new StringBuilder(length + 1); 
    Win32.SendMessage((IntPtr)hwnd, Win32.WM_GETTEXT, (IntPtr)sb.Capacity, sb); 
    return sb.ToString(); 
} 

每個獲取窗口字幕第二I輪詢與上述過程方法,但有時它不能檢測到顯示的窗口。有問題的窗口打開超過一秒鐘,所以它不是聚合頻率。

當窗口關閉/打開時,有更可靠的方法獲得回調嗎?

回答

1

也許最簡單的方法來聽窗口創建和銷燬是使用CBT hook。收聽HCBT_CREATEWNDHCBT_DESTROYWND。本MSDN文章Windows Hooks in the .NET Framework涵蓋了.net視角的主題。

+0

感謝快速回復,它需要的ThreadId,哪能確保我使用的GUI線程? – Anders

+0

我不明白。你能詳細說明嗎? –