Тема: AHK: Принудительное завершение, смена приоритетов процессов
Немного изменённый Instant process priority alteration.
Ctrl + Q — меню,
Ctrl + Esc — принудительное завершение процесса.
Можно ли изменить такое поведение: после «зависания» некоторых приложений, попытка их завершения влечёт за собой также и выгрузку процесса Проводника?
#SingleInstance Force
Menu, priority, add, Realtime, Change_P_Priority
Menu, priority, add, High, Change_P_Priority
Menu, priority, add, Above Normal, Change_P_Priority
Menu, priority, add, Normal, Change_P_Priority
Menu, priority, add, Below Normal, Change_P_Priority
Menu, priority, add, Low, Change_P_Priority
Menu, priority, add
Menu, priority, add, Kill Process %a_tab%Ctrl+Esc, Kill_Process
^q::
IfEqual, 1,, WinGet, PID_Target, PID, A
Else SetEnv, PID_Target, %1%
Menu, priority, show
Exit
Return
Change_P_Priority:
StringLeft, new_priority, A_ThisMenuItem, 1
Process, Priority, %PID_Target%, %new_priority%
Return
^Esc::
Kill_Process:
Gosub, Get_ExePath
MsgBox, 4, Подтверждение, `n`tПроцесс:`t%Exe_Path%`t`t`n`tИД:`t%PID_Target%`n`n`tВыгрузить?`t`n`n
IfMsgBox, Yes
{
If Exe_Path contains explorer.exe
{
; Завершение процесса explorer.exe (без перезапуска Проводника)
Process, Exist, Explorer.exe
PID_Target := ErrorLevel
h_process := DllCall("OpenProcess", UInt, 0x1, Int, 0, UInt, PID_Target) ; 0x1 — право доступа «PROCESS_TERMINATE»
DllCall("TerminateProcess", UInt, h_process, UInt, 1)
DllCall("CloseHandle", UInt, h_process)
}
Else
Process, Close, %PID_Target%
}
IfMsgBox, No
Return
Return
Get_ExePath:
ID_Wnd := WinExist( "A" ) ; получаем ID ОКНА
If Not ID_Wnd ; если ОКНО не найдено...
{
MsgBox, Окно не найдено!
Return ; конец скрипта
}
WinGet, PID_Target, PID, ahk_id %ID_Wnd% ; получаем PID найденного окна ОКНА
Exe_Path := GetModuleFileNameEx( PID_Target ) ; вызываем функцию получения пути процесса ОКНА
If Not Exe_Path ; если что-то не так...
{
MsgBox, Процесс не существует, или к нему нет доступа
Return ; конец скрипта
}
Return
GetModuleFileNameEx(PID) { ; shimanov - www.autohotkey.com/forum/viewtopic.php?p=54838#54838
hpr := DllCall( "OpenProcess", UInt,1040, Int,0, UInt,PID )
If ( ErrorLevel or !hpr )
Return
VarSetCapacity( Name,255 )
DllCall( "psapi.dll\GetModuleFileNameExA", UInt,hPr, UInt,0, Str,Name, UInt,255 )
DllCall( "CloseHandle", hPr )
Return, Name
}