听取其他流程窗口

时间:2013-04-15 10:43:58

标签: c# winapi

我们有一个第三方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频率。

当窗口关闭/打开时,是否有更可靠的方法来获取回调?

2 个答案:

答案 0 :(得分:1)

听取窗口创建和销毁的最简洁方法可能是使用CBT hook。聆听HCBT_CREATEWNDHCBT_DESTROYWND。这篇MSDN文章Windows Hooks in the .NET Framework从.net的角度介绍了这一主题。

答案 1 :(得分:-1)