如何通过命令关闭 pidgin?

如何通过命令关闭 pidgin?

该问题描述于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运行(cmdpowershell)以获取使用信息,但您需要的基本命令是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
        }
    }
}

相关内容