代码之家  ›  专栏  ›  技术社区  ›  adeel825

如何确定应用程序使用的窗口句柄数?

  •  4
  • adeel825  · 技术社区  · 16 年前

    确定应用程序使用多少窗口句柄的最佳方法是什么?是否有我可以使用的工具或WMI性能计数器?

    我想运行一个应用程序,观察某种计数器,看看窗口句柄的数量在增加。

    for (int i=0; i < 1000; i++)
    {
        System.Threading.Thread.Sleep(1000);
        RichTextBox rt = new RichTextBox();
        rt.Text = "hi";
        this.Controls.Add(rt);
    }
    

    我正在运行上述代码并观察进程中的“handle count”计数器,它似乎没有增加。有什么我看不正确的地方吗?

    4 回复  |  直到 15 年前
        1
  •  9
  •   Lou Franco    16 年前

    电脑附带的Perfmon可以做到这一点。还可以将列添加到“任务管理器进程”选项卡(句柄计数)。

    性能说明

    1. 添加计数器(单击+)
    2. 在性能对象下选择进程
    3. 选择计数器列表下的句柄计数
    4. 从实例列表中选择进程
    5. 单击添加,单击关闭

    要使图表在范围内,必须右键单击列表中的图表,选择“属性”,然后选择正确的比例(.1或.01可能是正确的)。

    编辑(响应添加的信息):我认为您刚刚证明了创建richtextbox不会导致分配句柄。我认为在您编辑控件之前它并不真正需要一个控件,而且这样做可能足够聪明,因为为一个不活动的控件分配太多的资源会使在窗体上拥有许多控件变得困难(例如,考虑Excel)。

        2
  •  3
  •   gimel    16 年前

    Process Monitor 在交互监视Windows进程使用的各种资源方面非常方便。

    进程监视器是一种高级的Windows监视工具,用于显示实时文件系统、注册表和进程/线程活动。

    注意-如果你的意思是用程序查找信息, .NET 提供对所有性能计数器的访问。你使用 System.Diagnostics.PerformanceCounter 类如下:

    PerformanceCounter PC=new PerformanceCounter();
    PC.CategoryName="Process";
    PC.CounterName="Handles";
    PC.InstanceName="MyProc";
    MessageBox.Show(PC.NextValue().ToString());
    
        3
  •  0
  •   computinglife    16 年前

    taskmanager显示的句柄数与perfmon显示的句柄数相同。

    SysInternals中的ProcessExplorer工具可以列出不同类型的句柄及其名称,您可以通过浏览该列表来了解程序使用的句柄的组成。

    但恐怕它并没有为您描述这些句柄类型。

    使用processexplorer-view-show lower pane view-handles查看实际句柄及其类型。

    您还可以使用一些排序窗口间谍工具,它显示系统中的所有窗口,如Microsoft Spy++或托管间谍。++( http://msdn.microsoft.com/en-us/magazine/cc163617.aspx )

    这将允许您查看是否正在创建窗口。

        4
  •  0
  •   user24770    15 年前

    PerfMon或任务管理器无法仅为进程使用的窗口句柄数提供所有类型(文件、线程等)的句柄总数。

    关于这个问题我能找到的最好的信息是 this post,它指示可以通过枚举主进程窗口的所有子窗口来确定进程的窗口句柄计数。