我们有一个第三方 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();
}
每一秒我都用上述方法轮询进程,但有时它无法检测到显示的窗口。有问题的窗口打开超过一秒钟,因此它不是 pol 频率。
当窗口关闭/打开时,是否有更可靠的方法来获取回调?