Что нового

как завершить процесс по определённым признакам

S

ShAG1992D

Гость
Версия AutoIt: 3.

Описание:
У меня вопрос на первый взгляд легкий но я не смог нигде найти ответа.
Например есть 2 и более процессов, они запущены и называются процесс.ехе но раскиданы по разным папкам. Допустим на С:\процесс.ехе
D:\процесс.ехе
Е:\процесс.ехе
и нужно убить определённый например на диске D:\процесс.ехе
Как это сделать если ProcessClose убивает первый попавшийся процесс.
Заранее благодарен...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ShAG1992D,
_WinAPI_GetProcessFileName() из WinAPIEx.au3 (см. мою подпись) укажет путь к файлу процесса по его PID.
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Код:
$list = ProcessList("notepad.exe")
for $i = 1 to $list[0][0]
  MsgBox(0, '', _ProcessGetLocation($list[$i][1]))
	If _ProcessGetLocation($list[$i][1]) = "C:\Windows\system32\notepad.exe" Then
		ProcessClose($list[$i][1])
	EndIf
next

Func _ProcessGetLocation($iPID)
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc[0] = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int[1024]')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
    Return $aReturn[3]
EndFunc
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Мой вариант:
Код:
#include <WinAPIEx.au3>

$Processes = ProcessList()
For $i = 3 To $Processes[0][0]
	$WorkDir = _WinAPI_GetProcessFileName($Processes[$i][1])
	If $WorkDir = 'C:\Windows\system32\notepad.exe' Then ProcessClose($Processes[$i][1])
Next
 
Верх