优雅的 Win32 无窗口进程终止

Graceful Win32 windowless process termination

我正在开发一个用 C# 编写的控制台应用程序,我在其中触发 Application.Run() 来管理系统托盘。应用程序本身是 window-less.

这是我遇到的挑战 - 当用户关闭应用程序时,我需要进行清理,并确保从系统托盘中删除应用程序图标。当我连接并分配了控制台 window 时很容易做到,因为我可以使用 SetConsoleCtrlHandler.

但是,当我没有分配和附加控制台 window 时,问题就开始了(因为应用程序大部分时间都是这样运行的)。我想 优雅地 终止另一个进程的进程,这样我就可以在我的应用程序中调用 SetConsoleCtrlHandler 并进行清理。但是,我为 Windows 找到的所有指导都是通过发送 WM_CLOSE 消息,这不适用,因为我没有任何 windows 可用于该应用程序。

所以,考虑到有问题的应用程序是用 CreateProcess 启动的,我有进程 ID、句柄和主线程 ID。

问题:有没有办法让我优雅地告诉另一个应用程序终止而不调用 TerminateProcess(这不会给任何清理余地) ?

我想我可能需要实现一个命名管道,以便在这种情况下我可以在客户端应用程序和“服务器”之间进行通信,但是有一种方法可以很好地要求进程包装,这感觉有点过分了事情了。

我认为,您应该实施自己的沟通方式。恕我直言,最简单的方法是使用命名事件。控制台应用程序创建命名事件并有时检查它。外部应用程序设置事件以防退出第一个应用程序。 此方法仅适用于 Windows。