Что нового

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

dwerf

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

CreatoR

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

Garrett

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

dwerf

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

Garrett

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

dwerf

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

Garrett

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

dwerf

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Хороший скрипт. Особенно понравилось про список ассоциированных окон. Как-то даже не задумывался о такой возможности, хотя пару раз надо было посмотреть именно это. Вобщем, +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
Репутация
218
kzru_hunter сказал(а):
но если выйти из Text Only и нажмём на этот процесс, то никакой информации не увидим.
Также в программе нельзя увидеть пути для некоторых процессов.
Ещё можно у некоторых процессов в начале пути убрать \??\.
Также у процесса smss.exe выводится путь \SystemRoot\System32\smss.exe, этот \SystemRoot можно было бы изменить на @WindowsDir
Исправил.
Без 'SeDebugPrivilege' у некоторых процессов действительно не отображался путь.
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Теперь намного лучше :smile: Стабильная версия
 
Автор
D

dwerf

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

Yashied

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

Код:
#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
 
Верх