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

时间:2008-10-13 12:55:28

标签: windows winapi

确定应用程序使用的窗口句柄数的最佳方法是什么?是否有可以使用的工具或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 个答案:

答案 0 :(得分:9)

计算机附带的Perfmon可以做到。您还可以向任务管理器进程选项卡(处理计数)添加一列。

Perfmon说明

  1. 添加一个计数器(点击+)
  2. 在“效果对象”下选择“处理”
  3. 在计数器列表
  4. 下选择处理计数
  5. 从实例列表中选择您的流程
  6. 单击“添加”,然后单击“关闭”
  7. 要获取范围内的图形,您必须在列表中右键单击它,选择属性,然后选择正确的比例(.1或.01可能是正确的)

    编辑(响应添加的信息):我认为您刚刚证明创建RichTextBox不会导致Handles被分配。我不认为它真的需要一个,直到你编辑控件,它可能足够聪明,因为为一个非活动的控件分配太多的资源将使得很难在一个控件上有很多控件表格(例如,考虑Excel)。

答案 1 :(得分:3)

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

  

Process Monitor是Windows的高级监控工具,可显示实时文件系统,注册表和进程/线程活动。

注意 - 如果您的意思是以编程方式查找信息, .Net 可以访问所有性能计数器。您可以像这样使用 System.Diagnostics.PerformanceCounter类:

PerformanceCounter PC=new PerformanceCounter();
PC.CategoryName="Process";
PC.CounterName="Handles";
PC.InstanceName="MyProc";
MessageBox.Show(PC.NextValue().ToString());

答案 2 :(得分:0)

taskmanager显示的句柄计数与PerfMon显示的句柄计数相同

sysinternals中的ProcessExplorer工具可以列出不同类型的句柄及其进程使用的名称,您可以通过浏览该程序使用的句柄组成的列表来获得一个好主意。

但我担心它不能为你提供这些句柄类型。

使用ProcessExplorer查看实际句柄及其类型 - 查看 - 显示下方窗格视图 - 句柄。

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

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

答案 3 :(得分:0)

Perfmon或任务管理器无法向您提供进程使用的WINDOW句柄数量,仅为所有类型的句柄总数(文件,线程等)。

我可以找到关于这个主题的最佳信息是this帖子,它表明可以通过枚举主进程窗口的所有子窗口来确定进程的窗口句柄计数。