명령줄 또는 파일에 GDI 개체 수를 에코합니다.

명령줄 또는 파일에 GDI 개체 수를 에코합니다.

저는 궁극적으로 프로세스의 GDI 개체 수가 기본 제한인 10,000에 가까워지면 경고하는 자동 경고를 설정하는 방법을 찾고 있습니다. 우리 회사에서 사용하는 일부 소프트웨어에는 경고 없이 충돌이 발생할 때까지 explorer.exe의 카운트가 누적되는 알려진 문제가 있습니다. 분명히 소프트웨어의 이후 버전에 이 문제에 대한 수정 사항이 있지만 제 문제 이외의 이유로 업그레이드할 수는 없습니다. 제어. 내 생각은 GDI 수가 10,000 제한에 가까워지면 경고를 표시하는 백그라운드 프로그램/스크립트를 만드는 것입니다. 그러나 GDI 수를 볼 수 있는 유일한 방법은 작업 관리자나 프로세스 탐색기의 GUI를 통해서입니다. 어떻게든 자동으로 텍스트 파일에 덤프할 수 있다면 설정될 것입니다. 그건 가능해요.

GDIView 소프트웨어를 사용해 보았지만 우리 회사의 Antivirus에서 이를 플래그로 지정했는데 이는 내 통제 범위를 벗어났습니다.

sysinterals를 다운로드했지만 프로세스 탐색기에서 얻을 수 있는 GDI 수를 반영하는 명령줄 도구 중 하나를 얻을 수 있는 방법을 찾을 수 없습니다. 나는 또한 tasklist를 시도했지만 마찬가지로 GDI 수를 얻는 방법을 찾을 수 없습니다.

참고로 저는 Windows 10 컴퓨터를 사용하고 있습니다. 또한 Linux 하위 시스템이 활성화되어 있고 이를 통해 Ubuntu를 실행할 수 있습니다. Powershell이 ​​스크립트 실행을 차단하는 것처럼 보이지만 배치 또는 Python으로 어떤 작업을 수행하는 데 열려 있습니다.

답변1

Rudolf가 프로세스당 수를 제공하는 Powershell 코드의 작은 섹션을 찾았습니다.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 문탐험가 이름과 일치하고 메시지 상자를 게시합니다.

관련 정보