如何以编程方式关闭 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_ENDSESSION
和 WM_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 bot ping 用户 [关闭]