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

5

如何最好地确定应用程序使用多少个窗口句柄?是否有工具或WMI性能计数器可用?

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

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

我正在运行上述代码,并观察进程中的“句柄计数”计数器,但它似乎没有增加。我是否看错了什么?

4个回答

11

Perfmon 可以做到这一点,它随计算机一起提供。您也可以在任务管理器进程选项卡中添加列(句柄计数)。

Perfmon 操作说明

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

要使图形保持在适当范围内,您必须右键单击列表中的图形,选择属性,然后选择正确的刻度(.1 或 .01 可能是正确的)。

编辑(回应添加的信息):我认为您刚刚证明创建 RichTextBoxes 不会导致分配句柄。直到您编辑控件时,它可能还不需要一个,这可能是聪明的,因为为一个不活动的控件分配太多资源会让在一个表单上有很多控件变得困难(例如 Excel)。


好观点 - 你有没有想法如何产生分配句柄的行为? - adeel825
我不是很确定你想做什么。我认为调用GlobalAlloc将会增加句柄计数。以下是你需要的声明:http://network.programming-in.net/articles/art9-1.asp?f=GlobalAlloc - Lou Franco
1
大约在2016年,句柄计数不再出现在任务管理器的进程选项卡中(适用于Windows 10)。这要归功于微软。 - thang

3

进程监视器非常方便,可以交互式地监视Windows进程使用的各种资源。

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

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

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

0

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

我能找到的关于此主题的最佳信息是this帖子,该帖子指出,可以通过枚举主进程窗口的所有子窗口来确定进程的窗口句柄计数。


0

任务管理器显示的句柄计数与 PerfMon 显示的一样。

Sysinternals 的 ProcessExplorer 工具可以列出进程使用的不同类型的句柄及其名称,通过浏览该列表,您可以对程序使用的句柄的组成有一个很好的了解。

但是恐怕它不会为您总结这些句柄类型的计数。

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

您还可以使用一些窗口监视工具,例如 Microsoft spy++ 或 Managed Spy++(链接:http://msdn.microsoft.com/en-us/magazine/cc163617.aspx)。

这将使您能够查看是否创建了您的窗口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接