监听其他进程窗口

本文关键字:窗口 进程 其他 监听 | 更新日期: 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_CREATEWNDHCBT_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