C# 如何以编程方式关闭不协调?

C# 如何以编程方式关闭不协调?,c#,discord,application-shutdown,C#,Discord,Application Shutdown,我希望以适当的方式(无需调用)以编程方式关闭Discord 当然,优雅地关闭程序的通常方法是检查是否有与进程相关联的主窗口(例如:process.MainWindowHandle!=IntPtr.Zero),然后调用process.CloseMainWindow())。它将向主窗口发送关闭消息 它不适用于Discord,因为主窗口可能已经关闭,程序仍在后台运行。退出Discord的常用方法是右键单击任务栏图标并选择“退出Discord”,而不仅仅是关闭主窗口 Windows关闭时,Discord

我希望以适当的方式(无需调用)以编程方式关闭Discord

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

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


Windows关闭时,Discord会自动关闭。我认为Windows并不是简单地杀死所有不协调的进程,所以也许有一种方法可以像Windows那样做?

当Windows关闭时,它会向应用程序发送一系列事件,包括
WM\u ENDSESSION
WM\u QUIT
。此外,这个过程很复杂,不容易复制。但是,您可以在让系统处理消息之前重写消息处理程序以执行某些操作

如果要以编程方式退出应用程序,请尝试使用
公共静态外部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并且即使在关闭应用程序后也不在后台运行它,那么discord设置中有一个选项专门用于此。在名为“windows设置”的选项卡中,您可以选择在启动计算机时自动启动discord,或者在关闭主应用程序后关闭discord后台进程的第二个选项(这是我们想要的)因此,请单击该选项。

由于不协调减少,并且没有任何相关的主窗口(MainWindowHandle等于IntPtr.Zero),因此代码不起作用。除此之外,即使我强迫Discord打开,也不会发生任何事情(不像WM_CLOSE那样正确地关闭Discord)。