该问题描述于https://developer.pidgin.im/ticket/9698。
在 Linux 中,我可以问pkill pidgin
通过或来关闭 pidgin kill [pid]
。然后程序会处理它并自行关闭。Windows 不以这种方式工作。信号WM_CLOSE
只会关闭窗口,而不会关闭进程(就像您点击自己时一样x
)。
如何通过命令关闭 pidgin?
动机:似乎许多 XMPP 服务器需要客户端主动说“再见”才能意识到它们处于离线状态。换句话说,不需要keep-alive
数据包或没有超时(如果是,则延迟相当大)。通常,这不是什么大问题,因为我们会相应地启动和退出客户端(将关机算作退出)。但是,如果进入suspend
/hibernate
模式,就好像网络连接突然断开了一样 - pidgin 没有机会说“嘿,离线”。所以,我需要一个脚本来自动关闭 pidgin优雅地(暂停前直接执行)。
答案1
您需要的实用程序是taskkill.exe
,它是内置于 Windows 操作系统的命令行程序(大致类似于kill
类 Unix 系统),位于系统目录 (C:\Windows\System32\taskkill.exe)。默认情况下,它会要求(但不强制)程序退出,并且不使用窗口消息。
taskkill /?
从命令行 shell运行(cmd
或powershell
)以获取使用信息,但您需要的基本命令是taskkill /im pidgin.exe
(请注意,要终止的程序的映像名称上必须有扩展名)。执行不是在这里传递/f
标志,因为这将强制终止程序(类似于kill -9
),而不给它时间执行任何清理(虽然这对于您想要立即终止的程序或挂起并且不响应正常关闭请求的程序很有用)。
让它在注销时自动运行可能有点棘手;考虑使用任务计划程序。
答案2
这是一个 AutoHotkey 脚本,它模拟以下用户步骤:
- 如果尚未打开,则打开主窗口
- 发送Ctrl-Q以便洋泾浜退出
。
pidginMainWindowTitle := "Buddy List"
process, exist, pidgin.exe
if(ErrorLevel!=0) {
; Pidgin process is running -> close it
if(!winExist(pidginMainWindowTitle)) {
; ..but main window is not.
; determine full pidgin path
winGet, pidginPath, ProcessPath, ahk_exe pidgin.exe
if(pidginPath=="") {
msgbox, Process path empty?
exitapp
}
; run pidgin again: will open main window
run %pidginProcessPath%
; wait for the window max. 2 seconds
winWait, %pidginMainWindowTitle%,, 2
if(ErrorLevel==1) {
msgbox, Couldn't start main window
exitapp
}
; send exit key combo to pidgin main window
controlSend,, ^q, %pidginMainWindowTitle%
; wait for the process to close max. 2 seconds
process, WaitClose, pidgin.exe, 2
if(ErrorLevel) {
msgbox, Couldn't exit pidgin gracefully
exitapp
}
}
}