Что нового

[Элементы GUI] Получение списка процессов и запись в комбобокс

Kabanana1

Новичок
Сообщения
7
Репутация
0
Версия AutoIt: 3.8

Описание:
Мне хотелось бы сделать программу, похожую на Kernel Detective или Process hacker. Для начала нужно получить список всех запущенных на компьютере процессов и отобразить и в комбобоксе. И чтобы на щелчок на ПКМ по процессу появлялось меню и можно было закрыть / заморозить процесс. В функциях с процессами я сам разберусь, а вот с графическим интерфейсом врятли
Примечания:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <ComboConstants.au3>
#Include <GUIConstantsEx.au3>

$hForm = GUICreate('MyGUI', 300, 140)
$List = ProcessList()
$Data = ''
For $i = 1 To $List[0][0]
	$Data &= '|' & $List[$i][0]
Next
$Combo = GUICtrlCreateCombo('', 20, 20, 260, 160, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetData(-1, StringTrimLeft($Data, 1), $List[1][0])
GUICtrlCreateLabel('PID:', 20, 50, 22, 14)
$Label = GUICtrlCreateLabel($List[1][1], 43, 50, 40, 14)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case  0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Combo
			GUICtrlSetData($Label, ProcessExists(GUiCtrlRead($Combo)))
	EndSwitch
WEnd
 
Автор
K

Kabanana1

Новичок
Сообщения
7
Репутация
0
Огромное спасибо!
А как закрыть процесс, выбранный в комбобоксе?

Код:
ProcessClose($Combo)

$PID = ProcessExists($Combo) ; Will return the PID or 0 if the process isn't found.
If $PID Then ProcessClose($PID)
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
примерно так

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$List = ProcessList()
$Data = ''
For $i = 1 To $List[0][0]
    $Data &= '|' & $List[$i][0]
Next
$Form1 = GUICreate("Form1", 508, 346, 192, 124)
$Combo = GUICtrlCreateCombo('', 20, 20, 260, 160, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetData(-1, StringTrimLeft($Data, 1), $List[1][0])
GUICtrlCreateLabel('PID:', 20, 50, 22, 14)
$Label = GUICtrlCreateLabel($List[1][1], 43, 50, 40, 14)
$Button1 = GUICtrlCreateButton("Button1", 288, 88, 75, 25)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
			        Case $Combo
            GUICtrlSetData($Label, ProcessExists(GUiCtrlRead($Combo)))
		Case $Button1
			ProcessClose(ProcessExists(GUiCtrlRead($Combo))) ; или  ProcessClose(GUiCtrlRead($Combo))
	EndSwitch
WEnd
 
Автор
K

Kabanana1

Новичок
Сообщения
7
Репутация
0
Вот исходник программы, которая у меня получилась

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#RequireAdmin

Func _PROCESSSUSPEND($PROCESS)
	$PROCESSID = ProcessExists($PROCESS)
	If $PROCESSID Then
		$AI_HANDLE = DllCall("kernel32.dll", "int", "OpenProcess", "int", 2035711, "int", False, "int", $PROCESSID)
		$I_SUCESS = DllCall("ntdll.dll", "int", "NtSuspendProcess", "int", $AI_HANDLE[0])
		DllCall("kernel32.dll", "ptr", "CloseHandle", "ptr", $AI_HANDLE)
		If IsArray($I_SUCESS) Then
			Return 1
		Else
			SetError(1)
			Return 0
		EndIf
	Else
		SetError(2)
		Return 0
	EndIf
EndFunc

Func _PROCESSRESUME($PROCESS)
	$PROCESSID = ProcessExists($PROCESS)
	If $PROCESSID Then
		$AI_HANDLE = DllCall("kernel32.dll", "int", "OpenProcess", "int", 2035711, "int", False, "int", $PROCESSID)
		$I_SUCESS = DllCall("ntdll.dll", "int", "NtResumeProcess", "int", $AI_HANDLE[0])
		DllCall("kernel32.dll", "ptr", "CloseHandle", "ptr", $AI_HANDLE)
		If IsArray($I_SUCESS) Then
			Return 1
		Else
			SetError(1)
			Return 0
		EndIf
	Else
		SetError(2)
		Return 0
	EndIf
EndFunc

$List = ProcessList()
$Data = ''
For $i = 1 To $List[0][0]
    $Data &= '|' & $List[$i][0]
Next
$Form1 = GUICreate("Process Watcher", 300, 200, 192, 124)
$Combo = GUICtrlCreateCombo('', 20, 20, 260, 160, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetData(-1, StringTrimLeft($Data, 1), $List[1][0])
GUICtrlCreateLabel('Идентификатор процесса:', 30, 60, 80, 70)
$Label = GUICtrlCreateLabel($List[1][1], 43, 50, 40, 14)
$Button1 = GUICtrlCreateButton("Завершить", 20, 100, 75, 25)
$Button2 = GUICtrlCreateButton("Заморозить", 100, 100, 75, 25)
$Button3 = GUICtrlCreateButton("Продолжить", 180, 100, 75, 25)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
                    Case $Combo
            GUICtrlSetData($Label, ProcessExists(GUiCtrlRead($Combo)))
        Case $Button1
            ProcessClose(ProcessExists(GUiCtrlRead($Combo))) ; или  ProcessClose(GUiCtrlRead($Combo))
			Case $Button2
			 _PROCESSSUSPEND((ProcessExists(GUiCtrlRead($Combo))))

                Case $Button3
				_PROCESSRESUME	((ProcessExists(GUiCtrlRead($Combo))))



    EndSwitch
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
одна кнопка не активна - "завершить"
 

Юра

Новичок
Сообщения
1
Репутация
0
поле для кнопки нужно больше (активность для кнопки маловата)
 
Верх