S
sh01u
Гость
Допустим есть несколько процессов с одним именем, правильно ли использовать функцию TerminateProcess с условием что процессы были открыты через CreateProcess?
Код:
Func ProcessCloseW($s_pname)
Local Const $TH32CS_SNAPPROCESS = 0x00000002
Local $tagPROCESSENTRY32 = DllStructCreate("dword dwsize;dword cntUsage;dword th32ProcessID;uint th32DefaultHeapID;dword th32ModuleID;dword cntThreads;dword th32ParentProcessID;long pcPriClassBase;dword dwFlags;char szExeFile[260]")
Local $a_toolh = DllCall("Kernel32.dll", "long", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPPROCESS, "int", 0)
DllStructSetData($tagPROCESSENTRY32, 1, DllStructGetSize($tagPROCESSENTRY32))
Local $p_PROCESSENTRY32 = DllStructGetPtr($tagPROCESSENTRY32)
Local $a_pfirst = DllCall("Kernel32.dll", "int", "Process32First", "long", $a_toolh[0], "ptr", $p_PROCESSENTRY32)
While 1
$a_pnext = DLLCall("Kernel32.dll", "int", "Process32Next", "long", $a_toolh[0], "ptr", $p_PROCESSENTRY32)
If IsArray($a_pnext) And $a_pnext[0] = 0 Then ExitLoop
$i_close_pid = DllStructGetData($tagPROCESSENTRY32, "szExeFile")
If $i_close_pid = $s_pname Then
$a_popen = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", BitOR(0x0400,0x0004,0x0001), "int", 0, "dword", DllStructGetData($tagPROCESSENTRY32, "th32ProcessID"))
$a_exitcode = DllCall("kernel32.dll", "int", "GetExitCodeProcess", "hwnd", $a_popen[0], "int_ptr", DllStructGetPtr($pStruct))
DllCall("kernel32.dll", "bool", "TerminateProcess", "hwnd", $a_exitcode[1], "uint", $a_exitcode[2])
EndIf
WEnd
EndFunc
ProcessCloseW("notepad.exe")