Что нового

[Процессы] Мониторинг активных процессов и их окон

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
AutoIt: 3.3.6.1
Версия: 0.99

Категория: Процессы

Описание: Показывает активные процессы (PID, имя, путь) и их окна (заголовок, handle)

Код:
Код:
Opt('MustDeclareVars', 1)

;~ #include <GUIConstantsEx.au3>
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_CHECKED = 1
Global Const $GUI_SHOW = 16
Global Const $GUI_HIDE = 32
Global Const $GUI_ENABLE = 64
Global Const $GUI_DISABLE = 128

;~ #include <WindowsConstants.au3>
Global Const $WS_MAXIMIZEBOX = 0x00010000
Global Const $WS_MINIMIZEBOX = 0x00020000
Global Const $WS_SIZEBOX = 0x00040000
Global Const $WS_SYSMENU = 0x00080000
Global Const $WS_VSCROLL = 0x00200000
Global Const $WS_BORDER = 0x00800000
Global Const $WS_CAPTION = 0x00C00000
Global Const $WS_POPUP = 0x80000000
Global Const $WS_EX_COMPOSITED = 0x02000000
Global Const $WM_GETMINMAXINFO = 0x0024
Global Const $GUI_SS_DEFAULT_GUI = BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)


SetPrivilege('SeDebugPrivilege', 1)

Global $hPsAPI = DllOpen('Psapi.dll')
Global $hKernel = DllOpen('Kernel32.dll')

OnAutoItExitRegister('_DllClose')

Global $Sorted

Global $Form1 = GUICreate('Processes and windows monitor', 590, 510, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $WS_EX_COMPOSITED)

Global $Edit1 = GUICtrlCreateEdit('', 10, 10, 570, 430, 3152064)
GUICtrlSetResizing($Edit1, 102)
GUICtrlSetState($Edit1, $GUI_HIDE)
GUICtrlSetBkColor($Edit1, 0xFFFFFF)

Global $List1 = GUICtrlCreateList('', 10, 10, 160, 430, BitOr($WS_BORDER, $WS_VSCROLL))
GUICtrlSetResizing($List1, 354)

Global $Edit2 = GUICtrlCreateEdit('', 180, 10, 400, 430, 3152064)
GUICtrlSetResizing($Edit2, 102)
GUICtrlSetBkColor($Edit2, 0xFFFFFF)

Global $Prgs1 = GUICtrlCreateProgress(10, 210, 570, 20)
GUICtrlSetState($Prgs1, $GUI_HIDE)
GUICtrlSetResizing($Prgs1, 646)

Global $ChkB1 = GUICtrlCreateCheckbox('Text only', 10, 450, 60, 20)
GUICtrlSetResizing($ChkB1, 834)

Global $ChkB2 = GUICtrlCreateCheckbox('Correct the pathes while loading', 80, 450, 180, 20)
GUICtrlSetResizing($ChkB2, 834)

Global $Radi0 = GUICtrlCreateRadio('Sort with ProcessList()', 10, 480, 120, 20)
GUICtrlSetResizing($Radi0, 834)

Global $Radi1 = GUICtrlCreateRadio('Sort by ProcessID', 140, 480, 100, 20)
GUICtrlSetResizing($Radi1, 834)

Global $Radi2 = GUICtrlCreateRadio('Sort by ProcessName', 250, 480, 120, 20)
GUICtrlSetResizing($Radi2, 834)

Global $Butt1 = GUICtrlCreateButton('Reload', 420, 480, 160, 20)
GUICtrlSetResizing($Butt1, 836)

Global $Button_About = GUICtrlCreateButton('About', 420, 450, 160, 20)
GUICtrlSetResizing($Button_About, 836)

GUICtrlSetState($ChkB2, $GUI_CHECKED)
GUICtrlSetState($Radi2, $GUI_CHECKED)

GUIRegisterMsg($WM_GETMINMAXINFO, 'WM_GETMINMAXINFO')
GUISetState()

Reload()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Butt1
            Reload()

        Case $List1
            GetText()

        Case $ChkB1
            If BitAND(GUICtrlRead($ChkB1), $GUI_CHECKED) = $GUI_CHECKED Then
                GUICtrlSetState($Edit1, $GUI_SHOW)
                GUICtrlSetState($List1, $GUI_HIDE)
                GUICtrlSetState($Edit2, $GUI_HIDE)
            Else
                GUICtrlSetState($Edit1, $GUI_HIDE)
                GUICtrlSetState($List1, $GUI_SHOW)
                GUICtrlSetState($Edit2, $GUI_SHOW)
            EndIf

		Case $Button_About
			About()
    EndSwitch
WEnd

Func _DllClose()
    DllClose($hPsAPI)
    DllClose($hKernel)
EndFunc

Func WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    Local $Struct = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    If $hWnd = $Form1 Then
        DllStructSetData($Struct, 7, 598)
        DllStructSetData($Struct, 8, 511)
    EndIf
EndFunc

Func Reload()
    GUICtrlSetState($ChkB1, $GUI_DISABLE)
    GUICtrlSetState($ChkB2, $GUI_DISABLE)
    GUICtrlSetState($Butt1, $GUI_DISABLE)
	GUICtrlSetState($Radi0, $GUI_DISABLE)
	GUICtrlSetState($Radi1, $GUI_DISABLE)
	GUICtrlSetState($Radi2, $GUI_DISABLE)
    GUICtrlSetState($Edit1, $GUI_HIDE)
    GUICtrlSetState($List1, $GUI_HIDE)
    GUICtrlSetState($Edit2, $GUI_HIDE)
    GUICtrlSetState($Prgs1, $GUI_SHOW)
	GUICtrlSetState($Button_About, $GUI_DISABLE)

    GUICtrlSetData($Edit1, '')
    GUICtrlSetData($List1, '')
    GUICtrlSetData($Edit2, '')

    Local $aProcesses = ProcessList()
    If @error Or IsArray($aProcesses) <> 1 Or UBound($aProcesses, 0) <> 2 Or $aProcesses[0][0] <= 0 Then
        MsgBox(48, 'Error', 'Error in ProcessList()')
        Return SetError(1, 0, 0)
    EndIf

    Local $aWindows = WinList()
    If @error Or IsArray($aWindows) <> 1 Or UBound($aWindows, 0) <> 2 Or $aWindows[0][0] <= 0 Then
        MsgBox(48, 'Error', 'Error in WinList()')
        Return SetError(1, 0, 0)
    EndIf

    If BitAND(GUICtrlRead($Radi0), $GUI_CHECKED) = $GUI_CHECKED Then
        $Sorted = 0
    ElseIf BitAND(GUICtrlRead($Radi1), $GUI_CHECKED) = $GUI_CHECKED Then
        SortByPID($aProcesses)
        $Sorted = 1
    ElseIf BitAND(GUICtrlRead($Radi2), $GUI_CHECKED) = $GUI_CHECKED Then
        SortByPName($aProcesses)
        $Sorted = 2
    EndIf

    Local $percent = 100/$aProcesses[0][0], $progress = 0
    For $i = 1 To $aProcesses[0][0] Step +1
        GUICtrlSetData($Edit1, 'Process ID: '   & $aProcesses[$i][1] & @CRLF & _
                               'Process Name: ' & $aProcesses[$i][0] & @CRLF & _
                               'Process Path: ' & _ProcessGetPath($aProcesses[$i][1]) & @CRLF, 1)

        If $Sorted = 2 Then
            GUICtrlSetData($List1, $aProcesses[$i][0] & ' - ' & $aProcesses[$i][1] & '|')
        Else
            GUICtrlSetData($List1, $aProcesses[$i][1] & ' - ' & $aProcesses[$i][0] & '|')
        EndIf

        For $i2 = 1 To $aWindows[0][0] Step +1
            If WinGetProcess($aWindows[$i2][1]) = $aProcesses[$i][1] Then
                GUICtrlSetData($Edit1, 'Window Name: '   & $aWindows[$i2][0] & @CRLF & _
                                       'Window Handle: ' & $aWindows[$i2][1] & @CRLF, 1)
            EndIf
        Next

        GUICtrlSetData($Edit1, @CRLF, 1)

        $progress += $percent
        GUICtrlSetData($Prgs1, $progress)
    Next


    GUICtrlSetState($Prgs1, $GUI_HIDE)
    GUICtrlSetData($Prgs1, 0)
    If BitAND(GUICtrlRead($ChkB1), $GUI_CHECKED) = $GUI_CHECKED Then
        GUICtrlSetState($Edit1, $GUI_SHOW)
    Else
        GUICtrlSetState($List1, $GUI_SHOW)
        GUICtrlSetState($Edit2, $GUI_SHOW)
    EndIf
	GUICtrlSetState($Button_About, $GUI_ENABLE)
	GUICtrlSetState($Radi0, $GUI_ENABLE)
	GUICtrlSetState($Radi1, $GUI_ENABLE)
	GUICtrlSetState($Radi2, $GUI_ENABLE)
    GUICtrlSetState($ChkB1, $GUI_ENABLE)
    GUICtrlSetState($ChkB2, $GUI_ENABLE)
    GUICtrlSetState($Butt1, $GUI_ENABLE)
EndFunc

Func GetText()
    Local $Title = GUICtrlRead($List1), $PID, $Text
    If $Sorted = 2 Then
        $PID = StringTrimLeft($Title, StringInStr($Title, ' - ')+2)
    Else
        $PID = StringLeft($Title, StringInStr($Title, ' - ')-1)
    EndIf
    $Text = GUICtrlRead($Edit1)
    $Text = StringMid($Text, StringInStr($Text, 'Process ID: ' & $PID & @CRLF))
    $Text = StringLeft($Text, StringInStr($Text, @CRLF & @CRLF, 0, 1)-1)
    GUICtrlSetData($Edit2, $Text)
EndFunc

Func _ProcessGetPath($hPID)
    Local $sPath = DllStructCreate('char[1000]')
    Local $hProcess = DllCall($hKernel, 'int', 'OpenProcess', 'dword', 0x0400 + 0x0010, 'int', 0, 'dword', $hPID)
    DllCall($hPsAPI, 'long', 'GetModuleFileNameEx', 'long', $hProcess[0], 'int', 0, 'ptr', DllStructGetPtr($sPath), 'long', DllStructGetSize($sPath))
    DllCall($hKernel, 'int', 'CloseHandle', 'hwnd', $hProcess[0])
    Local $ret = DllStructGetData($sPath, 1)
    If BitAND(GUICtrlRead($ChkB2), $GUI_CHECKED) = $GUI_CHECKED Then
        Local $c, $Drives = DriveGetDrive('ALL')
        For $i = 1 To $Drives[0] Step +1
            If Not StringInStr($Drives[$i], ':') Then ContinueLoop
            $c = StringInStr($ret, $Drives[$i])
            If $c = 1 Then
                ExitLoop
            ElseIf $c > 1 Then
                $ret = StringTrimLeft($ret, $c-1)
                ExitLoop
            EndIf
        Next
        If StringInStr($ret, '\SystemRoot\') = 1 Then $ret = StringReplace($ret, '\SystemRoot', @WindowsDir, 1)
    EndIf
    Return $ret
EndFunc

Func SortByPID(ByRef $aArray)
    Local $max, $var, $id
    For $i = 1 To $aArray[0][0] Step +1
        $max = -1
        For $i2 = $i To $aArray[0][0] Step +1
            If $aArray[$i2][1] < $max Or $max = -1 Then
                $max = $aArray[$i2][1]
                $id = $i2
            EndIf
        Next
        For $i2 = 0 To 1 Step +1
            $var = $aArray[$i][$i2]
            $aArray[$i][$i2] = $aArray[$id][$i2]
            $aArray[$id][$i2] = $var
        Next
    Next
EndFunc

Func SortByPName(ByRef $aArray)
    If IsArray($aArray) <> 1 Or UBound($aArray, 0) <> 2 Then Return SetError(1)
    Local $vVar, $chr = -1, $max, $asc, $id
    For $i = 0 To $aArray[0][0] Step +1
        If StringLen($aArray[$i][0]) > $chr Or $chr = -1 Then $chr = StringLen($aArray[$i][0])
    Next
    For $chr = $chr To 1 Step -1
        For $num = 1 To $aArray[0][0] Step +1
            $max = -1
            For $i = $num To $aArray[0][0] Step +1
                $asc = Asc(StringMid($aArray[$i][0], $chr, 1))
                If $asc < $max Or $max = -1 Then
                    $max = $asc
                    $id = $i
                EndIf
            Next
            For $i = 0 To 1
                $vVar = $aArray[$id][$i]
                For $ii = $id-1 To $num Step -1
                    $aArray[$ii+1][$i] = $aArray[$ii][$i]
                Next
                $aArray[$num][$i] = $vVar
            Next
        Next
    Next
EndFunc

;==================================================================================
; Function:         SetPrivilege( $privilege, $bEnable )
; Description:      Enables (or disables) the $privilege on the current process
;                   (Probably) requires administrator privileges to run
;
; Author(s):        Larry (from autoitscript.com's Forum)
; Notes(s):
; http://www.autoitscript.com/forum/index.php?s=&showtopic=31248&view=findpost&p=223999
;==================================================================================

Func SetPrivilege( $privilege, $bEnable )
    Const $MY_TOKEN_ADJUST_PRIVILEGES = 0x0020
    Const $MY_TOKEN_QUERY = 0x0008
    Const $MY_SE_PRIVILEGE_ENABLED = 0x0002
    Local $hToken, $SP_auxret, $SP_ret, $hCurrProcess, $nTokens, $nTokenIndex, $priv
    Local $LUID, $TOKEN_PRIVILEGES, $NEWTOKEN_PRIVILEGES, $ret, $f ;MustDeclareVars, me
    $nTokens = 1
    $LUID = DLLStructCreate("dword;int")
    If IsArray($privilege) Then    $nTokens = UBound($privilege)
    $TOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $NEWTOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $hCurrProcess = DLLCall("kernel32.dll","hwnd","GetCurrentProcess")
    $SP_auxret = DLLCall("advapi32.dll","int","OpenProcessToken","hwnd",$hCurrProcess[0],   _
            "int",BitOR($MY_TOKEN_ADJUST_PRIVILEGES,$MY_TOKEN_QUERY),"int*",0)
    If $SP_auxret[0] Then
        $hToken = $SP_auxret[3]
        DLLStructSetData($TOKEN_PRIVILEGES,1,1)
        $nTokenIndex = 1
        While $nTokenIndex <= $nTokens
            If IsArray($privilege) Then
                $priv = $privilege[$nTokenIndex-1]
            Else
                $priv = $privilege
            EndIf
            $ret = DLLCall("advapi32.dll","int","LookupPrivilegeValue","str","","str",$priv,   _
                    "ptr",DLLStructGetPtr($LUID))
            If $ret[0] Then
                If $bEnable Then
                    DLLStructSetData($TOKEN_PRIVILEGES,2,$MY_SE_PRIVILEGE_ENABLED,(3 * $nTokenIndex))
                Else
                    DLLStructSetData($TOKEN_PRIVILEGES,2,0,(3 * $nTokenIndex))
                EndIf
                DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,1),(3 * ($nTokenIndex-1)) + 1)
                DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,2),(3 * ($nTokenIndex-1)) + 2)
                DLLStructSetData($LUID,1,0)
                DLLStructSetData($LUID,2,0)
            EndIf
            $nTokenIndex += 1
        WEnd
        $ret = DLLCall("advapi32.dll","int","AdjustTokenPrivileges","hwnd",$hToken,"int",0,   _
                "ptr",DllStructGetPtr($TOKEN_PRIVILEGES),"int",DllStructGetSize($NEWTOKEN_PRIVILEGES),   _
                "ptr",DllStructGetPtr($NEWTOKEN_PRIVILEGES),"int*",0)
        $f = DLLCall("kernel32.dll","int","GetLastError")
    EndIf
    $NEWTOKEN_PRIVILEGES=0
    $TOKEN_PRIVILEGES=0
    $LUID=0
    If $SP_auxret[0] = 0 Then Return 0
    $SP_auxret = DLLCall("kernel32.dll","int","CloseHandle","hwnd",$hToken)
    If Not $ret[0] And Not $SP_auxret[0] Then Return 0
    return $ret[0]
EndFunc

Func About()
	If Not IsDeclared('Form_About') Then
		Global $Form_About = GUICreate('About...', 275, 230, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), -1, $Form1)
		Global $A_Label_Name = GUICtrlCreateLabel('Processes and windows monitor', 10, 10, 255, 15)
		GUICtrlSetFont($A_Label_Name, 12, 600)
		Global $A_Label_Version = GUICtrlCreateLabel('Version: 0.99', 10, 30, 85, 15)
		GUICtrlSetFont($A_Label_Version, 11, 450)
		Global $A_Label_Author = GUICtrlCreateLabel('Author: dwerf', 10, 50, 70, 15)
		GUICtrlSetFont($A_Label_Author, 8.5, 450)
		Global $A_Label_Thanks = GUICtrlCreateLabel('Thanks to:' & @CRLF & 'Yashied' & @TAB & @TAB & 'kzru_hunter' & @CRLF & 'Larry' & @TAB & @TAB & 'BugFix' & @CRLF & 'Anton'  &  @TAB & @TAB & 'AspirinJunkie', 10, 80, 175, 65)
		GUICtrlSetFont($A_Label_Thanks, 10, 450)
		Global $A_Label_RU  = GUICtrlCreateLabel('http://autoitscript.ru/', 10, 165, 100, 17)
		GUICtrlSetFont($A_Label_RU, 8.5, 400, 0)
		GUICtrlSetColor($A_Label_RU, 0x0000FF)
		GUICtrlSetCursor($A_Label_RU, 0)
		Global $A_Label_DE  = GUICtrlCreateLabel('http://autoit.de/', 10, 185, 80, 17)
		GUICtrlSetFont($A_Label_DE, 8.5, 400, 0)
		GUICtrlSetColor($A_Label_DE, 0x0000FF)
		GUICtrlSetCursor($A_Label_DE, 0)
		Global $A_Label_COM = GUICtrlCreateLabel('http://autoitscript.com/', 10, 205, 110, 17)
		GUICtrlSetFont($A_Label_COM, 8.5, 400, 0)
		GUICtrlSetColor($A_Label_COM, 0x0000FF)
		GUICtrlSetCursor($A_Label_COM, 0)
		Global $A_Button_Close = GUICtrlCreateButton('OK', 185, 190, 80, 30)
	EndIf
	Local $L_Hover = 0, $gci
	GUISetState(@SW_SHOW, $Form_About)
	GUISetState(@SW_DISABLE, $Form1)
	While 1
		$gci = GUIGetCursorInfo($Form_About)
		If Not @error Then
			Switch $gci[4]
				Case $A_Label_RU
					If Not $L_Hover = 1 Then
						GUICtrlSetFont($A_Label_RU, 8.5, 400, 4)
						GUICtrlSetFont($A_Label_DE, 8.5, 400, 0)
						GUICtrlSetFont($A_Label_COM, 8.5, 400, 0)
						$L_Hover = 1
					EndIf
				Case $A_Label_DE
					If Not $L_Hover = 2 Then
						GUICtrlSetFont($A_Label_RU, 8.5, 400, 0)
						GUICtrlSetFont($A_Label_DE, 8.5, 400, 4)
						GUICtrlSetFont($A_Label_COM, 8.5, 400, 0)
						$L_Hover = 2
					EndIf
				Case $A_Label_COM
					If Not $L_Hover = 3 Then
						GUICtrlSetFont($A_Label_RU, 8.5, 400, 0)
						GUICtrlSetFont($A_Label_DE, 8.5, 400, 0)
						GUICtrlSetFont($A_Label_COM, 8.5, 400, 4)
						$L_Hover = 3
					EndIf
				Case Else
					If Not $L_Hover = 0 Then
						GUICtrlSetFont($A_Label_RU, 8.5, 400, 0)
						GUICtrlSetFont($A_Label_DE, 8.5, 400, 0)
						GUICtrlSetFont($A_Label_COM, 8.5, 400, 0)
						$L_Hover = 0
					EndIf
			EndSwitch
		EndIf
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE, $A_Button_Close
				ExitLoop
			Case $A_Label_RU
				ShellExecute('http://autoitscript.ru/')
			Case $A_Label_DE
				ShellExecute('http://autoit.de/')
			Case $A_Label_COM
				ShellExecute('http://autoitscript.com/')
		EndSwitch
	WEnd
	GUISetState(@SW_ENABLE, $Form1)
	GUISetState(@SW_HIDE, $Form_About)
EndFunc

Автор(ы): dwerf
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Было бы неплохо сделать в таком виде: в левой части программы есть список процессов. При клике на процесс в правой части появляется информация об этом процессе и его окна в виде таблицы (титул, хэндл).
 
Автор
D

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Garrett сказал(а):
Это почему же помоему известен Creat0R ;D
Нашёл на немецком форуме, автор не был указан. Забил в гугл, получил ссылку на тот самый форум, да на pastebin.com
По этому не известен. Найдётся - пускай отпишется, допишу ;)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Да ладно вам Автор, эта функция построена на основе инфы из MSDN :smile:, ничего особенного, её делали многие в самых разных обличиях.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Нашёл на сайте pastebin.com эту функцию! Да, она там, в изначально девственной форме написана, и отличается от той, что приводил CreatoR! Но тогда нужно хотя бы указать сайт, откуда заимствована сама функция или уж на крайней случай MSDN, там ведь тоже люди мозгами приложили!
 
Автор
D

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
kzru_hunter сказал(а):
Было бы неплохо сделать...
Сделал
Garrett сказал(а):
Но тогда нужно хотя бы указать сайт, откуда заимствована сама функция или уж на крайней случай MSDN, там ведь тоже люди мозгами приложили!
Мне кажется, это уже перебор. Это нужно будет и на гугл ссылаться, потому что в нём нашёл и на майкрософт, потому что виндовс сделали, на многоуважаемого Беннета итд.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
dwerf [?]
Мне кажется, это уже перебор. Это нужно будет и на гугл ссылаться, потому что в нём нашёл и на майкрософт, потому что виндовс сделали, на многоуважаемого Беннета итд.
Как вы считаете, если я возьму часть вашего кода (или весь), и добавлю часть своего кода, вследствие чего получу конечный продукт, это не будет являться "перебором", если я не укажу на то, что часть кода я позаимствовал у вас?
 
Автор
D

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Garrett сказал(а):
Как вы считаете, если я возьму часть вашего кода (или весь), и добавлю часть своего кода, вследствие чего получу конечный продукт, это не будет являться "перебором", если я не укажу на то, что часть кода я позаимствовал у вас?
Нет, не будет. Лично у меня берите на здоровье сколько угодно. Если я в каком нибудь случае буду против, я об этом отдельно напишу.
А конкретно по функции, так я написал, что автор не известен. На немецкий форум, на pastebin, на гугл, на Билла Гейтса и всех всех всех я не ссылаюсь, потому что не один из выше перечисленных не является автором этой функции. Из-за то что кто то туда этот код скопировал они не преобрели на него права.
Если сам автор вдруг объявится, с удовольствием напишу его имя большими буквами.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
dwerf [?]
Если я в каком нибудь случае буду против, я об этом отдельно напишу
Нет ну что вы, если играть так ва-банк! Или всё, или нечего!
dwerf [?]
На немецкий форум, на pastebin, на гугл, на Билла Гейтса и всех всех всех я не ссылаюсь, потому что не один из выше перечисленных не является автором этой функции.
Авторами функции ProcessGetPath может, и нет, но вот уж не знал, что вы являетесь автором библиотек Psapi.dll и Kernel32.dll!
Однако пусть это остаётся на вашей совести (с чем в наше время, к сожалению напряжёна)!
 
Автор
D

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
OffTopic:
Garrett сказал(а):
но вот уж не знал, что вы являетесь автором библиотек Psapi.dll и Kernel32.dll!
Никогда не видел, что ктото ссылается изза библиотеки ОС. Вы ссылаетесь? Покажете?
Garrett сказал(а):
(с чем в наше время, к сожалению напряжёна)!
Garrett сказал(а):
Нет ну что вы, если играть так ва-банк! Или всё, или нечего!
Угу
Garrett сказал(а):
Однако пусть это остаётся на вашей совести
Да будет так.
Спокойной ночи.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Хороший скрипт. Особенно понравилось про список ассоциированных окон. Как-то даже не задумывался о такой возможности, хотя пару раз надо было посмотреть именно это. Вобщем, +1
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Есть один недочёт: если нажать на Text only и пробежаться в самый низ, то увидим информацию про последний процесс, но если выйти из Text Only и нажмём на этот процесс, то никакой информации не увидим.

Также в программе нельзя увидеть пути для некоторых процессов. Это решается получением привилегий на открытие любого процесса c помощью функции _GetPrivilege_SeDebug:

Код:
_GetPrivilege_SeDebug()

; код программы

Func _GetPrivilege_SeDebug()	
	$ret=DllCall("ntdll.dll", "int", "RtlAdjustPrivilege", "int", 20, "int", 1, "int", 0, "int*", 0) ; 20 is SeDebug privilege...
	If @error Then
		SetError( 1, @error, False ) ; 1=error dllcall. Set dllcall-error as extended. Return false.
    Else
		if $ret[0] Then SetError( 2, $ret[0], False) ; 2=error RtlAdjustPrivilege. Set it's errorcode as extended. Return False.
		Return( True ) ; Return true if it worked. (RtlAdjustPrivilege returns 0 if it works.)
    EndIf
EndFunc


Ещё можно у некоторых процессов в начале пути убрать \??\.
Также у процесса smss.exe выводится путь \SystemRoot\System32\smss.exe, этот \SystemRoot можно было бы изменить на @WindowsDir
 
Автор
D

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
kzru_hunter сказал(а):
но если выйти из Text Only и нажмём на этот процесс, то никакой информации не увидим.
Также в программе нельзя увидеть пути для некоторых процессов.
Ещё можно у некоторых процессов в начале пути убрать \??\.
Также у процесса smss.exe выводится путь \SystemRoot\System32\smss.exe, этот \SystemRoot можно было бы изменить на @WindowsDir

Исправил.
Без 'SeDebugPrivilege' у некоторых процессов действительно не отображался путь.
 
Автор
D

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Добавлена возможность изменения размера окна скрипта.
Добавлена возможность сортировки по
  • имени
  • PID
Ну и так, по мелочи.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А еще можно в информацию для процессов добавить загрузку процессора(ов) и командную строку.

Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>

$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, 1)
_WinAPI_CloseHandle($hToken)

$aList = ProcessList()
For $i = 1 To $aList[0][0]
	$aList[$i][1] = _WinAPI_GetProcessCommandLine($aList[$i][1])
Next

If IsArray($aList) Then
	_ArrayDisplay($aList, '_WinAPI_GetProcessCommandLine')
EndIf
 
Верх