我最终想找到一种方法来设置自动警报,当进程的 GDI 对象计数接近默认的 10,000 个限制时,它会发出警告。我公司使用的某些软件有一个已知问题,它会导致 explorer.exe 计数不断增加,直到它在没有警告的情况下崩溃 - 显然在软件的更高版本中有一个修复程序,但由于我无法控制的原因,我们无法升级。我的想法是创建一个后台程序/脚本,当它看到 GDI 计数接近 10,000 个限制时会弹出警报。但是,我似乎只能通过任务管理器或进程资源管理器中的 GUI 来查看 GDI 计数 - 如果我能以某种方式将其自动转储到文本文件中,我就可以设置了,但我不知道这是否可行。
我尝试过 GDIView 软件,但是我们公司的防病毒软件对其进行了标记,这超出了我的控制范围。
我下载了 sysinterals,但找不到任何方法让命令行工具之一回显我在 Process Explorer 中获取的 GDI 计数。我也尝试过 tasklist,但同样找不到从中获取 GDI 计数的方法。
作为参考,我使用的是 Windows 10 机器。我还启用了 Linux 子系统,并能够通过它运行 Ubuntu。如果有用的话,我愿意用批处理或 Python 做一些事情 - 尽管似乎 powershell 被禁止运行脚本(不过我可能能够解决这个问题)。
答案1
我找到了一小段 Powershell 代码,它可以提供 Rudolf 编写的每个进程的计数在 Powershell 中获取每个进程的 GDI 对象数
"Number of GUI handles per process"
$sig = @'
[DllImport("User32.dll")]
public static extern int GetGuiResources(IntPtr hProcess, int uiFlags);
'@
Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32
$processes = [System.Diagnostics.Process]::GetProcesses()
[int]$gdiHandleCount = 0
ForEach ($p in $processes)
{
try{
$gdiHandles = [Win32.NativeMethods]::GetGuiResources($p.Handle, 0)
$gdiHandleCount += $gdiHandles
$p.Name + " : " + $gdiHandles.ToString()
}
catch {
#"Error accessing " + $p.Name
}
}
"Total number of GDI handles " + $gdiHandleCount.ToString()
应该可以修改 try ... Catch 语句中的命令以添加if 语句与您的资源管理器名称相匹配并发布消息框。