如何以编程方式关闭 Discord?

Posted

技术标签:

【中文标题】如何以编程方式关闭 Discord?【英文标题】:How to close Discord programmatically? 【发布时间】:2020-07-08 15:56:33 【问题描述】:

我想以适当的方式以编程方式关闭 Discord(不调用 Process.Kill())。

AFAIK 优雅地关闭程序的常用方法是检查是否存在与进程关联的主窗口(例如:Process.MainWindowHandle != IntPtr.Zero),然后调用Process.CloseMainWindow()。它将向主窗口发送关闭消息。

它不适用于 Discord,因为主窗口可能已经关闭,程序仍在后台运行。退出 Discord 的常用方法是右键单击任务栏图标并选择“退出 Discord”,而不仅仅是关闭主窗口。

当 Windows 关闭时,Discord 会自动关闭。我认为 Windows 不会简单地杀死所有 Discord 进程,所以也许有办法做类似于 Windows 所做的事情?

【问题讨论】:

【参考方案1】:

当 Windows 关闭时,它会向应用程序发送一堆事件,包括 WM_ENDSESSIONWM_QUIT。此外,该过程复杂且不易复制。但是,您可以在让系统处理消息之前覆盖消息处理程序System.Windows.Forms.Control.WndProc 来执行某些操作。

如果您想以编程方式退出应用程序,请尝试使用public static extern IntPtr PostMessage 将这两条消息发送到进程。

例子:

[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

const uint WM_QUERYENDSESSION = 0x11
const uint ENDSESSION_CLOSEAPP = 0x1;

public static void SendMessageToProcess(string processName)

    Process[] processList = Process.GetProcesses();
    foreach (var p in processList)
    
        if (p.ProcessName.Equals(processName))
        
            IntPtr hWnd = p.MainWindowHandle;
            PostMessage(hWnd, WD_QUERYENDSESSION, true, ENDSESSION_CLOSEAPP);
        
    


[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
protected override void WndProc(ref Message m) 

    switch (m.Msg)
    
        case WM_QUERYENDSESSION:
            //Do something
    
    base.WndProc(ref m);

【讨论】:

代码不起作用,因为 Discord 被减少并且没有任何关联的主窗口(MainWindowHandle 等于 IntPtr.Zero)。除此之外,即使我强制打开 Discord,也不会发生任何事情(不像 WM_CLOSE 正确关闭 Discord)。【参考方案2】:

我知道我看到这个帖子有点晚了,但是如果你想关闭 discord 并且即使在关闭应用程序后也不让它在后台运行,那么在 discord 设置中有一个专门用于此的选项。在名为“Windows 设置”的选项卡中,您可以选择在启动计算机时自动启动不和谐,或者在关闭主应用程序后关闭不和谐后台进程的第二个选项(这是我们想要的),因此单击该选项。

【讨论】:

以上是关于如何以编程方式关闭 Discord?的主要内容,如果未能解决你的问题,请参考以下文章

如何以更简洁的方式为 discord.py 编写嵌入代码?

当另一个人使用命令时,如何对 discord.py 机器人进行编程以通知我?

如何使用 discord.py 让 discord bot ping 用户 [关闭]

Discord.py:如何提取布尔值以判断某人是不是静音

如何在 discord.py 中嵌入如下图所示的按钮? [关闭]

将 Minecraft 禁令原因链接到 Discord.js [关闭]