如何使用 Autohotkey 优雅地关闭程序

acm*_*123 0 autohotkey

我有一个脚本,用于通过提供完整的 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%

上述脚本有任何可能的解决方案或修复吗?

use*_*297 5

首先我会尝试

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