vicbox777
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: чтоб возвращала не только список процессов но и абсолютные пути к ним | Вот можно так, это функция CreatoR-a, я только переделал, чтоб можно было показать в сообщении, ибо изначально там был двухмерный массив, который можно токо отобразить как - ArrayDisplay...Но я думаю, что нам же нужно именно чтоб в сообщении... Код: #include <Array.au3> $Processlist=_ProcessListEx() If $Processlist==-1 then MsgBox(0,"Внимание","Ошибка при получении списка процессов") else MsgBox(0,"результат",$Processlist) Endif ;===================================================================== Func _ProcessListEx($sResourceName="", $sInResString="", $iWholeWord=1) Local $aProcList = ProcessList() Local $hKernel32_Dll = DllOpen('Kernel32.dll'), $hPsapi_Dll = DllOpen('Psapi.dll') Local $aOpenProc, $aProcPath, $sFileVersion, $aRet_List[1][1] If $hKernel32_Dll = -1 Then Return -1 If $hPsapi_Dll = -1 Then $hPsapi_Dll = DllOpen(@SystemDir & '\Psapi.dll') If $hPsapi_Dll = -1 Then $hPsapi_Dll = DllOpen(@WindowsDir & '\Psapi.dll') If $hPsapi_Dll = -1 Then Return -1 Local $vStruct = DllStructCreate('int[1024]') Local $pStructPtr = DllStructGetPtr($vStruct) Local $iStructSize = DllStructGetSize($vStruct) For $i = 1 To UBound($aProcList)-1 $aOpenProc = DllCall($hKernel32_Dll, 'hwnd', 'OpenProcess', _ 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1]) If Not IsArray($aOpenProc) Or Not $aOpenProc[0] Then ContinueLoop DllCall($hPsapi_Dll, 'int', 'EnumProcessModules', _ 'hwnd', $aOpenProc[0], _ 'ptr', $pStructPtr, _ 'int', $iStructSize, _ 'int*', 0) $aProcPath = DllCall($hPsapi_Dll, 'int', 'GetModuleFileNameEx', _ 'hwnd', $aOpenProc[0], _ 'int', DllStructGetData($vStruct, 1), _ 'str', '', _ 'int', 2048) DllCall($hKernel32_Dll, 'int', 'CloseHandle', 'int', $aOpenProc[0]) If Not IsArray($aProcPath) Or StringLen($aProcPath[3]) = 0 Then ContinueLoop $sFileVersion = FileGetVersion($aProcPath[3], $sResourceName) If $sResourceName = "" Or $sFileVersion = $sInResString Or _ ($iWholeWord = 0 And StringInStr($sFileVersion, $sInResString)) Then $aRet_List[0][0] += 1 ReDim $aRet_List[$aRet_List[0][0]+1][3] $aRet_List[$aRet_List[0][0]][0] = $aProcList[$i][0] ;Process Name $aRet_List[$aRet_List[0][0]][1] = $aProcList[$i][1] ;PID (Process ID) $aRet_List[$aRet_List[0][0]][2] = $aProcPath[3] ;Process File Path EndIf Next DllClose($hKernel32_Dll) DllClose($hPsapi_Dll) If $aRet_List[0][0] < 1 Then Return -1 Local $avArray[1],$k,$PList for $k+=1 to $aRet_List[0][0] _ArrayAdd($avArray, $aRet_List[$k][0]&":"&$aRet_List[$k][1]&" ("&$aRet_List[$k][2]&")") Next $PList=_ArrayToString($avArray, @CRLF, 1,$aRet_List[0][0]) Return $PList EndFunc | Там можно сделать, чтоб ID процесса не отображался, и еще чтоб красивей как то, я додумался только путь к программам заключать в кавычки. Цитата: откопал тут функцию чего только не выдаёт, но всёравно может у кого по проще реализация есть. | Думаю эта функция, что ты нашел, будет попроще всех, нужно только переделать (если нужно только путь), то вобще мало кода будет... | Всего записей: 165 | Зарегистр. 17-06-2008 | Отправлено: 21:26 23-05-2009 | Исправлено: vicbox777, 21:38 23-05-2009 |
|