监听其他进程窗口
本文关键字:窗口 进程 其他 监听 | 更新日期: 2023-09-27 18:09:08
我们有一个需要批量运行的第三方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频率。
当窗口关闭/打开时,是否有更可靠的方法获得回调?
监听窗口创建和销毁的最干净的方法可能是使用CBT钩子。听HCBT_CREATEWND
和HCBT_DESTROYWND
。这篇MSDN文章《。net框架中的Windows Hooks》从。net的角度介绍了这个主题。
也许这有帮助
[1] http://spradip.wordpress.com/category/programming-c/page/2/和这个c++的例子
[2] http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701 (v = vs.85) . aspx