Windows 应用程序 - 处理 taskkill
Windows Application - handle taskkill
我有一个 Output Type
设置为 Windows Application
的 C# 应用程序,所以它基本上只是一个后台进程 运行ning。我可以在任务管理器中看到该进程,我试图从命令行优雅地终止它,并且还能够在我的代码中处理这个终止。我 运行 taskkill /im myprocess.exe
消息是
SUCCESS: Sent termination signal to the process "MyProcess.exe"
with PID 61
我的问题是在这之后我仍然可以在任务管理器中看到进程。如果我 taskkill /f
它会关闭它,但我肯定不希望那样,因为我需要在我的进程退出之前 运行 编码。
如何在我的应用程序中处理这个 "termination signal" 以便我可以执行必要的退出前操作然后退出?
如果您查看 taskkill
实际执行的操作 you will find,它会向进程的消息循环发送 WM_CLOSE
消息。所以你需要找到一种方法来处理这个消息并退出应用程序。
下面的小型测试应用程序展示了一种方法来做到这一点。如果您使用 CTRL+F5 快捷方式从 Visual Studio 运行 它(以便进程 运行 s 在调试器之外)你实际上可以使用 taskkill /IM [processname]
.
关闭它
using System;
using System.Security.Permissions;
using System.Windows.Forms;
namespace TaskKillTestApp
{
static class Program
{
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
private class TestMessageFilter : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == /*WM_CLOSE*/ 0x10)
{
Application.Exit();
return true;
}
return false;
}
}
[STAThread]
static void Main()
{
Application.AddMessageFilter(new TestMessageFilter());
Application.Run();
}
}
}
我有一个 Output Type
设置为 Windows Application
的 C# 应用程序,所以它基本上只是一个后台进程 运行ning。我可以在任务管理器中看到该进程,我试图从命令行优雅地终止它,并且还能够在我的代码中处理这个终止。我 运行 taskkill /im myprocess.exe
消息是
SUCCESS: Sent termination signal to the process "MyProcess.exe" with PID 61
我的问题是在这之后我仍然可以在任务管理器中看到进程。如果我 taskkill /f
它会关闭它,但我肯定不希望那样,因为我需要在我的进程退出之前 运行 编码。
如何在我的应用程序中处理这个 "termination signal" 以便我可以执行必要的退出前操作然后退出?
如果您查看 taskkill
实际执行的操作 you will find,它会向进程的消息循环发送 WM_CLOSE
消息。所以你需要找到一种方法来处理这个消息并退出应用程序。
下面的小型测试应用程序展示了一种方法来做到这一点。如果您使用 CTRL+F5 快捷方式从 Visual Studio 运行 它(以便进程 运行 s 在调试器之外)你实际上可以使用 taskkill /IM [processname]
.
using System;
using System.Security.Permissions;
using System.Windows.Forms;
namespace TaskKillTestApp
{
static class Program
{
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
private class TestMessageFilter : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == /*WM_CLOSE*/ 0x10)
{
Application.Exit();
return true;
}
return false;
}
}
[STAThread]
static void Main()
{
Application.AddMessageFilter(new TestMessageFilter());
Application.Run();
}
}
}