windows /f 是否在关闭时终止进程?
Does windows /f teminate processes on shutdown?
我正在使用以下代码来处理 taskkill
我的进程:
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
private class TestMessageFilter : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == /*WM_CLOSE*/ 0x10)
{
MessageBox.Show("I'm shutting down");
var mailService = new MailService();
mailService.SendEmail("Test from application exit");
//Application.Exit();
return true;
}
return false;
}
}
然后
static void Main(string[] args)
{
Application.AddMessageFilter(new TestMessageFilter());
Application.Run();
}
弹出MessageBox
,当我taskkill /im MyProcess.exe
时发送邮件。然而,这不会在 windows 关机时发生。
Windows 是在关闭时强行终止进程还是我遗漏了什么?
操作系统使用的一般模式是请求 运行 进程正常终止,如果它们没有在超时内终止,则将其杀死。某些应用程序会在关闭时弹出保存更改提示,但它们可能不会实际出现在用户面前 - Windows 可以显示 "shutting down" 屏幕并表示某些进程仍在 运行 - 做你想杀死他们并关闭吗?
我相信如果您使用 Windows 表单,您可以获得与此处使用 Closing/Closed 事件*相同的结果,因此您可以通过保存一些来查看其中任何一个是否触发文本到文件(并确保刷新它),并查看是否以相同的方式在 PreFilterMessage 中获得任何其他消息代码。
*您可能会得到 Closing 或 Closed 或两者,因此请检查两者。例如您可以在没有事先关闭的情况下获得关闭。
您可以在 IMessageFilter 中看到 WM_CLOSE 完全是偶然的,并且是 taskkill.exe 的实现细节。您通常只会看到 发布的 条消息,通常会发送 WM_CLOSE 条消息。我想你看到 taskkill.exe 首先试图很好地询问,只有在应用程序响应速度不够快时才使用大锤。任务管理器过去也这样做,但在以后的 Windows 版本中不再这样做。
不,它肯定无法在 Windows 关机时工作。它 向 window 发送 一条 WM_QUERYENDSESSION 消息以宣布关闭。
有很多充分的理由将此作为一项服务。但只要你想这样做,你就需要 window 才能看到该消息。订阅它的 FormClosing 事件,e.CloseReason 属性 告诉你它为什么要关闭。您会看到 CloseReason.WindowsShutDown
。您只需要保持 window 不可见以使其与您拥有的等效,重写 SetVisibleCore() 方法,如 this post 所示。
我正在使用以下代码来处理 taskkill
我的进程:
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
private class TestMessageFilter : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == /*WM_CLOSE*/ 0x10)
{
MessageBox.Show("I'm shutting down");
var mailService = new MailService();
mailService.SendEmail("Test from application exit");
//Application.Exit();
return true;
}
return false;
}
}
然后
static void Main(string[] args)
{
Application.AddMessageFilter(new TestMessageFilter());
Application.Run();
}
弹出MessageBox
,当我taskkill /im MyProcess.exe
时发送邮件。然而,这不会在 windows 关机时发生。
Windows 是在关闭时强行终止进程还是我遗漏了什么?
操作系统使用的一般模式是请求 运行 进程正常终止,如果它们没有在超时内终止,则将其杀死。某些应用程序会在关闭时弹出保存更改提示,但它们可能不会实际出现在用户面前 - Windows 可以显示 "shutting down" 屏幕并表示某些进程仍在 运行 - 做你想杀死他们并关闭吗?
我相信如果您使用 Windows 表单,您可以获得与此处使用 Closing/Closed 事件*相同的结果,因此您可以通过保存一些来查看其中任何一个是否触发文本到文件(并确保刷新它),并查看是否以相同的方式在 PreFilterMessage 中获得任何其他消息代码。
*您可能会得到 Closing 或 Closed 或两者,因此请检查两者。例如您可以在没有事先关闭的情况下获得关闭。
您可以在 IMessageFilter 中看到 WM_CLOSE 完全是偶然的,并且是 taskkill.exe 的实现细节。您通常只会看到 发布的 条消息,通常会发送 WM_CLOSE 条消息。我想你看到 taskkill.exe 首先试图很好地询问,只有在应用程序响应速度不够快时才使用大锤。任务管理器过去也这样做,但在以后的 Windows 版本中不再这样做。
不,它肯定无法在 Windows 关机时工作。它 向 window 发送 一条 WM_QUERYENDSESSION 消息以宣布关闭。
有很多充分的理由将此作为一项服务。但只要你想这样做,你就需要 window 才能看到该消息。订阅它的 FormClosing 事件,e.CloseReason 属性 告诉你它为什么要关闭。您会看到 CloseReason.WindowsShutDown
。您只需要保持 window 不可见以使其与您拥有的等效,重写 SetVisibleCore() 方法,如 this post 所示。