將 GDI 物件計數回顯到命令列或文件

將 GDI 物件計數回顯到命令列或文件

我最終正在尋找一種方法來設定自動警報,如果進程的 GDI 物件計數接近預設的 10,000 限制,該警報會向我發出警告。我公司使用的某些軟體有一個已知問題,該問題會導致explorer.exe 不斷累積計數,直至崩潰而不發出警告- 顯然在該軟體的更高版本中已修復此問題,但由於超出我的原因,我們無法升級控制。我的想法是創建一個後台程式/腳本,當它看到 GDI 計數接近 10,000 限制時會彈出警報。然而,我似乎可以查看GDI 計數的唯一方法是透過任務管理器或Process Explorer 中的GUI - 如果我能以某種方式自動將其轉儲到文字檔案中,我就會被設置,但我不知道是否可以這是可能的。

我嘗試過 GDIView 軟體,但我們公司的防毒軟體對其進行了標記,這超出了我的控制範圍。

我已經下載了 sysinterals,但我無法找到任何方法來取得命令列工具之一來回顯我可以在 Process Explorer 中取得的 GDI 計數。我也嘗試過任務列表,但同樣無法找到從中獲取 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 語句與您的資源管理器名稱相符並發布訊息方塊。

相關內容