Получить количество объектов GDI процесса - PullRequest
0 голосов
/ 25 февраля 2011

Я хочу получить количество объектов GDIO для определенных процессов.

При использовании Windows XP это было возможно с getGUIResources() для user32.dll, но в Windows Vista и -7 он возвращает 0 дляпроцессы, выполняющиеся с ..\System.

Как узнать количество объектов GDI?

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Попробуйте этот код. Это работает для меня на Windows 7. Я подумал: «Если диспетчер задач может это сделать, то я могу это сделать». Я не уверен, требуются ли для этого права администратора, но я проверил с .

В этом примере я получаю информацию из winlogon.exe, который запускается с учетными данными SYSTEM.

Вывод на мою машину:

Process ID: 584
Process handle: 0x00000198
GDI objects: 6

, который соответствует тому, что показывает диспетчер задач. winlogon.exe showing SYSTEM and 6 GDI objects

#RequireAdmin

#include <WinAPI.au3>

Const $PROCESS_QUERY_LIMITED_INFORMATION  = 0x1000

; Get ID to process
$id = ProcessExists("winlogon.exe")
If @error Then
    ConsoleWrite("Error in ProcessExists: " & @error & @CRLF)
    Exit
EndIf
ConsoleWrite("Process ID: " & $id & @CRLF)

; Get handle to process from the ID
$handle = _WinAPI_OpenProcess($PROCESS_QUERY_LIMITED_INFORMATION, False, $id)
If @error Then
    ConsoleWrite("Error in _WinAPI_OpenProcess: " & @error & @CRLF)
    Exit
EndIf
ConsoleWrite("Process handle: " & $handle & @CRLF)

; Get number of GDI objects via GetGuiResources
$gdiCount = _WinAPI_GetGuiResources(0, $handle)
If @error Then
    ConsoleWrite("Error in _WinAPI_GetGuiResources: " & @error & @CRLF)
    Exit
EndIf
ConsoleWrite("GDI objects: " & $gdiCount & @CRLF)

; Close handle to process
_WinAPI_CloseHandle($handle)
1 голос
/ 26 февраля 2011

Возможно, что-то касается прав доступа, ваш скрипт не может получить доступ к процессам с более высокими привилегиями.Я не уверен, что здесь, но попробуйте: Запустите ваш скрипт с правами администратора, добавив его в ваш скрипт:

#RequireAdmin
...