我正在开发一个用 C# 编写的控制台应用程序,我在其中触发了 Application.Run()
管理系统托盘。应用程序本身是无窗口的。
这是我遇到的挑战 - 当用户关闭应用程序时,我需要进行清理,并确保从系统托盘中删除应用程序图标。当我连接并分配了一个控制台窗口时很容易做到,因为我可以使用 SetConsoleCtrlHandler
.
但是,当我没有分配和附加控制台窗口时,问题就开始了(因为应用程序大部分时间都是这样运行的)。我想从另一个进程优雅地终止进程,这样我就可以调用 SetConsoleCtrlHandler
在我的应用程序中进行清理。但是,我发现针对 Windows 执行此操作的所有指导都是通过发送 WM_CLOSE
消息,这不适用,因为我没有任何可用于该应用程序的窗口。
因此,考虑到有问题的应用程序是用 CreateProcess
启动的,我有进程 ID、句柄和主线程 ID。
问题:有没有办法让我优雅地告诉其他应用程序终止而不调用 TerminateProcess
(这不会给任何清理余地)?
我在想我可能需要实现一个命名管道,以便在这种情况下我可以在客户端应用程序和“服务器”之间进行通信,但是有一种方法可以很好地要求进程将事情打包起来,这感觉有点过分了.
最佳答案
我认为,您应该实现自己的沟通方式。恕我直言,最简单的方法是使用命名事件。控制台应用程序创建命名事件并有时检查它。外部应用程序设置事件以防退出第一个应用程序。 此方法仅适用于 Windows。
关于c# - 优雅的 Win32 无窗口进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68250858/