我正在使用以下代码处理我的进程中的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
,当我resources :users do
get 'reservations', on: :member
end
resources :listings do
resources :reservations
end
时会发送电子邮件。但是,在Windows关闭时不会发生这种情况。
Windows会在关机时强行终止进程,还是我错过了什么?
答案 0 :(得分:1)
你可以在IMessageFilter中看到WM_CLOSE是非常偶然的,也是taskkill.exe的一个实现细节。您通常只会看到发布的消息,通常会发送WM_CLOSE。我认为你看到taskkill.exe首先尝试很好地问,只有当应用程序响应不够快时才使用大锤。任务管理器过去也曾这样做,但在以后的Windows版本中不再存在。
不,它肯定无法在Windows关机时运行。它向窗口发送 WM_QUERYENDSESSION消息以宣告关闭。
很多理由让这项服务成为一种服务。但只要你想这样做,那么你需要一个窗口来查看该消息。订阅其FormClosing事件,e.CloseReason属性告诉您它关闭的原因。你会看到CloseReason.WindowsShutDown
。您只需要保持窗口不可见以使其等同于您拥有的窗口,覆盖SetVisibleCore()方法,如this post中所示。
答案 1 :(得分:0)
操作系统使用的一般模式是请求正在运行的进程正常终止,如果它们不在超时内终止则终止它们。某些应用程序会在关机时弹出保存更改提示,但它们实际上可能不会显示给用户 - Windows可以显示"关闭"屏幕并说某些进程仍在运行 - 你想杀死它们并关闭吗?
我相信如果您使用Windows窗体,您可以获得与此处关闭/关闭事件*相同的结果,因此您可以通过将某些文本保存到文件来查看其中任何一个是否触发(以及确保刷新它,并且还看看你是否以相同的方式在PreFilterMessage中获得任何其他消息代码。
*您可以选择关闭或关闭,或两者兼而有之,请检查两者。例如你可以在没有事先结账的情况下结账。