Что нового

Как закрыть процесс по его PID

ArgoNaft

Новичок
Сообщения
129
Репутация
0
Почему не закрывает окно блокнота? Или как верно поймать PID тогда процесса блокнота? Только не нужно через Handle ... пожалуйста :smile: Вот при запуске как ловить и именно из командной строки.
Код:
Local $PID
$PID = Run(@ComSpec & ' /c ' & 'notepad')
ProcessWaitClose($PID)
ConsoleWrite($PID & @CRLF)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
$PID = Run(@ComSpec & ' /c ' & 'notepad')
здесь $PID cmd.exe, у notepad pid свой.
 
Автор
A

ArgoNaft

Новичок
Сообщения
129
Репутация
0
а как узнать пид блокнота он же дочка по сути
 

blacklis

Новичок
Сообщения
64
Репутация
1
Код:
$WinHandle = "name" ;- Имя окна
$pid = WinGetProcess($WinHandle)

" Только не нужно через Handle ... пожалуйста Вот при запуске как ловить и именно из командной строки."
нафига всё усложнять?
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Код:
$PID = ProcessExists("Notepad.exe")
If $PID <> 0 Then ProcessWaitClose($PID)
 
Автор
A

ArgoNaft

Новичок
Сообщения
129
Репутация
0
Ну так то понятно. Но мне надо во время создания узнавать ... Потому что с таким названием могут быть еще и другие окна, я думаю не верно узнавать PID по названию окна это не сто процентная гарантия точного PID, если есть похожие процессы например.
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Код:
Local $PID
$PID = Run(@ComSpec & ' /c ' & 'notepad')
RunWait("taskkill /T /PID " & $PID) ; Завершить с дочерними процессами

По идее должно работать. Но у меня пишет "сервер RPC не доступен" :whistle:
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Так еще можно получить дочерние процессы:
Код:
;~ #include<WinAPIEx.au3>
Local $PID
$PID = Run(@ComSpec & ' /c ' & 'notepad')
Sleep(500)
Local $pList=ProcessList(),$sProcParent="Родительский процесс "&$PID&" имеет следующие дочерние процессы:"&@CRLF
For $i=1 To $pList[0][0]
	Local $pi=_WinAPI_GetParentProcess($pList[$i][1])
	If $pi=$PID Then
		$sProcParent&=$pList[$i][1]&" - "&$pList[$i][0]&@CRLF
	EndIf
Next
$sProcParent=StringStripWS($sProcParent,2)
MsgBox(0,'',$sProcParent)

Func _WinAPI_GetParentProcess($PID = 0)
	If Not $PID Then
		$PID = @AutoItPID
	EndIf
	Local $hSnapshot = DllCall('kernel32.dll', 'ptr', 'CreateToolhelp32Snapshot', 'dword', 0x00000002, 'dword', 0)
	If (@error) Or (Not $hSnapshot[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Local $tPROCESSENTRY32 = DllStructCreate('dword Size;dword Usage;dword ProcessID;ulong_ptr DefaultHeapID;dword ModuleID;dword Threads;dword ParentProcessID;long PriClassBase;dword Flags;wchar ExeFile[260]')
	Local $pPROCESSENTRY32 = DllStructGetPtr($tPROCESSENTRY32)
	Local $Ret, $Result = 0
	$hSnapshot = $hSnapshot[0]
	DllStructSetData($tPROCESSENTRY32, 'Size', DllStructGetSize($tPROCESSENTRY32))
	$Ret = DllCall('kernel32.dll', 'int', 'Process32FirstW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32)
	While (Not @error) And ($Ret[0])
		If DllStructGetData($tPROCESSENTRY32, 'ProcessID') = $PID Then
			$Result = DllStructGetData($tPROCESSENTRY32, 'ParentProcessID')
			ExitLoop
		EndIf
		$Ret = DllCall('kernel32.dll', 'int', 'Process32NextW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32)
	WEnd
	_WinAPI_CloseHandle($hSnapshot)
	If Not $Result Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Result
EndFunc
Func _WinAPI_CloseHandle($hObject)
	Local $aResult = DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hObject)
	If @error Then Return SetError(@error, @extended, False)
	Return $aResult[0]
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
sngr,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх