Что нового

[Процессы] Как отследить создание и закрытие процесса?

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Здравствуйте, как можно отследить создание и закрытие процесса?
Т.е мне нужно узнать что появился/закрылся процесс.
Такой алгоритм не предлагать:
Код:
Func _GetPR()
	Local $Temp = ''
	Local $PRL = ProcessList()
	if $TempPR[0] <> $PRL[0][0] Then
		For $i=1 To $PRL[0][0]
			$Temp = $PRL[$i][0]&':'&$PRL[$i][1]&'|'&$Temp
		Next
		GUICtrlSetData($Tab[0][0],'')
		GUICtrlSetData($Tab[0][0],$Temp)
		$TempPR[0] = $PRL[0][0]
	EndIf
EndFunc

Т.к ProcessList() грузит цп очень хорошо... от 0-10 на нетбуке. Мне нужно хотя бы получать сколько всего процессов сейчас работают, просто число запущенных процессов... Если таковая функция существует. Заранее спасибо! :IL_AutoIt_1:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Ganibal95 [?]
Мне нужно хотя бы получать сколько всего процессов сейчас работают, просто число запущенных процессов.

это из udf CompInfo
Код:
#include <array.au3>
Global	$cI_CompName = @ComputerName
Global	$wbemFlagReturnImmediately	= 0x10, _
$wbemFlagForwardOnly		= 0x20
Dim $aProcessInfo
_ComputerGetProcesses($aProcessInfo)
For $i = 1 to UBound($aProcessInfo) - 1
	ConsoleWrite($aProcessInfo[$i][0] & @CRLF)
Next
_ArrayDisplay($aProcessInfo)

;===============================================================================
; Description:      Returns the Process information in an array.
; Parameter(s):     $aProcessInfo - By Reference - Process Information array.
; Requirement(s):   None
; Return Value(s):  On Success - Returns array of Process Information.
;						$aProcessInfo[0][0]   = Number of Processes
;						$aProcessInfo[$i][0]  = Name ($i starts at 1)
;						$aProcessInfo[$i][1]  = Command Line
;						$aProcessInfo[$i][2]  = Creation Class Name
;						$aProcessInfo[$i][3]  = Creation Date
;						$aProcessInfo[$i][4]  = Description
;						$aProcessInfo[$i][5]  = CS Creation Class Name
;						$aProcessInfo[$i][6]  = CS Name
;						$aProcessInfo[$i][7]  = Executable Path
;						$aProcessInfo[$i][8]  = Execution State
;						$aProcessInfo[$i][9]  = Handle
;						$aProcessInfo[$i][10] = Handle Count
;						$aProcessInfo[$i][11] = Kernel Mode Time
;						$aProcessInfo[$i][12] = Maximum Working Set Size
;						$aProcessInfo[$i][13] = Minimum Working Set Size
;						$aProcessInfo[$i][14] = OS Creation Class Name
;						$aProcessInfo[$i][15] = OS Name
;						$aProcessInfo[$i][16] = Other Operation Count
;						$aProcessInfo[$i][17] = Other Transfer Count
;						$aProcessInfo[$i][18] = Page Faults
;						$aProcessInfo[$i][19] = Page File Usage
;						$aProcessInfo[$i][20] = Parent Process ID
;						$aProcessInfo[$i][21] = Peak Page File Usage
;						$aProcessInfo[$i][22] = Peak Virtual Size
;						$aProcessInfo[$i][23] = Peak Working Set Size
;						$aProcessInfo[$i][24] = Priority
;						$aProcessInfo[$i][25] = Private Page Count
;						$aProcessInfo[$i][26] = Process ID
;						$aProcessInfo[$i][27] = Quota Non Paged Pool Usage
;						$aProcessInfo[$i][28] = Quota Paged Pool Usage
;						$aProcessInfo[$i][29] = Quota Peak Non Paged Pool Usage
;						$aProcessInfo[$i][30] = Quota Peak Paged Pool Usage
;						$aProcessInfo[$i][31] = Read Operation Count
;						$aProcessInfo[$i][32] = Read Transfer Count
;						$aProcessInfo[$i][33] = Session ID
;						$aProcessInfo[$i][34] = Status
;						$aProcessInfo[$i][35] = Thread Count
;						$aProcessInfo[$i][36] = User Mode Time
;						$aProcessInfo[$i][37] = Virtual Size
;						$aProcessInfo[$i][38] = Windows Version
;						$aProcessInfo[$i][39] = Working Set Size
;						$aProcessInfo[$i][40] = Write Operation Count
;						$aProcessInfo[$i][41] = Write Transfer Count
;                   On Failure - @error = 1 and Returns 0
;								@extended = 1 - Array contains no information
;											2 - $colItems isnt an object
; Author(s):        Jarvis Stubblefield (support "at" vortexrevolutions "dot" com)
; Note(s):
;===============================================================================
Func _ComputerGetProcesses(ByRef $aProcessInfo)
	Local $colItems, $objWMIService, $objItem
	Dim $aProcessInfo[1][42], $i = 1

	$objWMIService = ObjGet("winmgmts:\\" & $cI_Compname & "\root\CIMV2")
	$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

	If IsObj($colItems) Then
		For $objItem In $colItems
			ReDim $aProcessInfo[UBound($aProcessInfo) + 1][42]
			$aProcessInfo[$i][0]  = $objItem.Name
			$aProcessInfo[$i][1]  = $objItem.CommandLine
			$aProcessInfo[$i][2]  = $objItem.CreationClassName
			$aProcessInfo[$i][3]  = __StringToDate($objItem.CreationDate)
			$aProcessInfo[$i][4]  = $objItem.Description
			$aProcessInfo[$i][5]  = $objItem.CSCreationClassName
			$aProcessInfo[$i][6]  = $objItem.CSName
			$aProcessInfo[$i][7]  = $objItem.ExecutablePath
			$aProcessInfo[$i][8]  = $objItem.ExecutionState
			$aProcessInfo[$i][9]  = $objItem.Handle
			$aProcessInfo[$i][10] = $objItem.HandleCount
			$aProcessInfo[$i][11] = $objItem.KernelModeTime
			$aProcessInfo[$i][12] = $objItem.MaximumWorkingSetSize
			$aProcessInfo[$i][13] = $objItem.MinimumWorkingSetSize
			$aProcessInfo[$i][14] = $objItem.OSCreationClassName
			$aProcessInfo[$i][15] = $objItem.OSName
			$aProcessInfo[$i][16] = $objItem.OtherOperationCount
			$aProcessInfo[$i][17] = $objItem.OtherTransferCount
			$aProcessInfo[$i][18] = $objItem.PageFaults
			$aProcessInfo[$i][19] = $objItem.PageFileUsage
			$aProcessInfo[$i][20] = $objItem.ParentProcessId
			$aProcessInfo[$i][21] = $objItem.PeakPageFileUsage
			$aProcessInfo[$i][22] = $objItem.PeakVirtualSize
			$aProcessInfo[$i][23] = $objItem.PeakWorkingSetSize
			$aProcessInfo[$i][24] = $objItem.Priority
			$aProcessInfo[$i][25] = $objItem.PrivatePageCount
			$aProcessInfo[$i][26] = $objItem.ProcessId
			$aProcessInfo[$i][27] = $objItem.QuotaNonPagedPoolUsage
			$aProcessInfo[$i][28] = $objItem.QuotaPagedPoolUsage
			$aProcessInfo[$i][29] = $objItem.QuotaPeakNonPagedPoolUsage
			$aProcessInfo[$i][30] = $objItem.QuotaPeakPagedPoolUsage
			$aProcessInfo[$i][31] = $objItem.ReadOperationCount
			$aProcessInfo[$i][32] = $objItem.ReadTransferCount
			$aProcessInfo[$i][33] = $objItem.SessionId
			$aProcessInfo[$i][34] = $objItem.Status
			$aProcessInfo[$i][35] = $objItem.ThreadCount
			$aProcessInfo[$i][36] = $objItem.UserModeTime
			$aProcessInfo[$i][37] = $objItem.VirtualSize
			$aProcessInfo[$i][38] = $objItem.WindowsVersion
			$aProcessInfo[$i][39] = $objItem.WorkingSetSize
			$aProcessInfo[$i][40] = $objItem.WriteOperationCount
			$aProcessInfo[$i][41] = $objItem.WriteTransferCount
			$i += 1
		Next
		$aProcessInfo[0][0] = UBound($aProcessInfo) - 1
		If $aProcessInfo[0][0] < 1 Then
			SetError(1, 1, 0)
		EndIf
	Else
		SetError(1, 2, 0)
	EndIf
EndFunc


Func __StringToDate($dtmDate)
	Return (StringMid($dtmDate, 5, 2) & "/" & _
			StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
			& " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
EndFunc
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
joiner
Через объект(winmgmts) не очень подходит вариант, т.к следить за процессами я буду в цикле... Нужна какая-нибудь универсальная функция например WinAPI...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Ganibal95, есть WinApi.au3 есть WinApiex.au3 , посмотри там.
только вот вопрос - как работают эти функции ?
ну не мне ж тебя учить..ты ж гуру ..это ты мне должен объяснить такой простой вопрос - как следить за изменениями в списке процессов. ;)
OffTopic:
про антивирь забудь
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Сделал так:
Код:
Global $___GAPI_GetProcessNumbD = DllStructCreate("dword[1024]")
Global $___GAPI_GetProcessNumbP = DllStructGetPtr($___GAPI_GetProcessNumbD), $___GAPI_GetProcessNumbS = DllStructGetSize($___GAPI_GetProcessNumbD)

Func _GAPI_GetProcessNumb()
	Local $ret = DllCall('psapi.dll', "int", "EnumProcesses", "ptr", $___GAPI_GetProcessNumbP, "dword", $___GAPI_GetProcessNumbS, "dword*", 0)
	if $ret[0] == 1 And $ret[3] > 0 Then Return $ret[3] / 4
	Return 0
EndFunc


Цп 0-2... Мне подходит :smile:
 

Dimmak

Знающий
Сообщения
185
Репутация
9
Ganibal95
$ret[3] / 4 - показывает точное количество процессов? :scratch:
 
Верх