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