我有一个脚本,通过给它提供完整的exe路径(例如“ c:\ run \ myprogram.exe”)来关闭程序,我希望它能正常关闭程序。我已经成功使用Process, Close, %hWnd%
或WinClose, ahk_id %iId%
强制执行了此操作,但是我一直在寻找一种方法,该方法可以通过给定程序的完整路径关闭它,然后在没有强制关闭的情况下正常关闭它。
到目前为止,我有这个脚本:
closeByExactPathToEXE(path) {
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") {
If (ePath := process.ExecutablePath){
iName := process.Name
iId := process.ProcessId
hWnd := process.Handle
ePath := process.ExecutablePath
SplitPath, ePath,, oPath,,,oDrive
;MsgBox % "Letter:" oDrive "`nPath: "oPath "`npath" path
If !InStr(ePath,path)
Continue
Loop, parse, exCludes, CSV
If (iName = A_LoopField )
Continue
;My NO!!!
If (iId = AmiNO) or (iName = A_ScriptName)
continue
;~ MsgBox % "Letter:" oDrive "`nPath: "oPath
;~ Process, Close, %hWnd%
;~ PostMessage, 0x112, 0xF060,,, %hWnd% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE
;~ PostMessage, 0x112, 0xF060,,, %iName% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE
;~ WinClose, ahk_id %iId%
}
}
}
上面的脚本接受完整路径,应正常关闭给定程序。 我发现的最接近的东西是:
PostMessage, 0x112, 0xF060,,, %hWnd% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE
和:
PostMessage, 0x112, 0xF060,,, %iName% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE
但是,它们不适用于%hWnd%
和%iName%
。
上述脚本有任何可能的解决方案或解决方案吗?
答案 0 :(得分:1)
首先我会尝试
WinClose, ahk_id %iId%
因为
WinClose (WM_Close消息)是最不强制的方法:
WinClose, WinTitle
PostMessage(SC_Close消息)类似于WM_Close,但更有效:
PostMessage, 0x112, 0xF060,,,WinTitle
WinKill 尝试执行WM_Close,然后尝试终止该进程:
WinKill, WinTitle
Process,Close 是最有效的方法-等同于从任务管理器中终止进程:
Process,Close, ProcessName.exe