【问题标题】:How to close a program gracefully using Autohotkey如何使用 Autohotkey 优雅地关闭程序
【发布时间】:2019-12-21 19:15:42
【问题描述】:

我有一个脚本,我用它来关闭一个程序,给它一个完整的 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%

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

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    首先我会尝试

    WinClose, ahk_id %iId%
    

    因为

    • WinCloseWM_Close消息)是最不有力的方式:

      WinClose, WinTitle

    • PostMessageSC_Close 消息)类似于 WM_Close,但更强大:

      PostMessage, 0x112, 0xF060,,,WinTitle

    • WinKill 尝试 WM_Close,然后尝试终止进程:

      WinKill, WinTitle

    • Process,Close是最有力的方式——相当于从任务管理器杀死一个进程:

      Process,Close, ProcessName.exe

    【讨论】:

    • WinClose 没有产生我想要的结果。
    • 我只是想强调 WinClose 是最优雅的方式。如果如你所说,你已经成功地做到了,你应该继续练习。
    • 测试不成功
    • 下一步可能是PostMessage, 0x112, 0xF060,,, ahk_exe ProcessName.exe(在WinWaitClose ahk_id %iId%,, 2if ErrorLevel之后)等等。
    • 我不想只给出exe名称,因为有多个同名运行的程序,我想给出更接近的程序的完整exe路径以关闭它
    猜你喜欢
    • 2018-03-11
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多