0

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

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

4

2 回答 2

1

听窗口创建和销毁最干净的方法可能是使用CBT 挂钩。听HCBT_CREATEWNDHCBT_DESTROYWND。这篇 MSDN 文章.NET Framework 中的 Windows Hooks从 .net 的角度介绍了该主题。

于 2013-04-15T10:47:16.447 回答
-1

也许这可以帮助

[1] http://spradip.wordpress.com/category/programming-c/page/2/

这是任何 ms C++ 示例

[2] http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx

于 2013-04-15T11:17:42.360 回答