我有一个脚本,用于通过提供完整的 exe 路径(例如“c:\run\myprogram.exe”)来关闭程序,并且我希望它能够正常关闭它。我已经成功地使用Process, Close, %hWnd%or强制执行此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%
}
}
}Run Code Online (Sandbox Code Playgroud)
上面的脚本接受完整路径,并且应该正常关闭给定的程序。我发现的最接近的东西是这样的:
PostMessage, 0x112, 0xF060,,, %hWnd% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE
Run Code Online (Sandbox Code Playgroud)
和:
PostMessage, 0x112, 0xF060,,, %iName% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE
Run Code Online (Sandbox Code Playgroud)
但是,它们不能与%hWnd%和 一起使用%iName%。
上述脚本有任何可能的解决方案或修复吗?
首先我会尝试
WinClose, ahk_id %iId%
Run Code Online (Sandbox Code Playgroud)
因为
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
| 归档时间: |
|
| 查看次数: |
6343 次 |
| 最近记录: |