我們有第三方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輪詢與上述過程方法,但有時它不能檢測到顯示的窗口。有問題的窗口打開超過一秒鐘,所以它不是聚合頻率。
當窗口關閉/打開時,有更可靠的方法獲得回調嗎?
感謝快速回復,它需要的ThreadId,哪能確保我使用的GUI線程? – Anders
我不明白。你能詳細說明嗎? –