c# - 优雅的 Win32 无窗口进程终止

标签 c# c++ windows winapi

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

Screenshot of the application configuration in Visual Studio

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

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

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

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

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

最佳答案

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

关于c# - 优雅的 Win32 无窗口进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68250858/

相关文章:

c# - iOS 中没有 bcrypt 实现...可以使用其他语言,创建静态库吗?

c# - WebRequest 不会使缓存项在同一进程中可用

c++ - 如何在停止 io_service 之前等待所有挂起的完成处理程序被执行?

c++ - 如何使用已安装的 firefox 或 chrome 在 C++ 应用程序中呈现 html

c++ - 什么是 WaitNamedPipe 的重叠 I/O 替代方案?

c# - 如何代理对对象实例的调用

c# - 我无法访问数组的 Count 属性,而是通过转换为 ICollection!

c++ - 从 C++ 中的时区名称获取时区偏移量

c++ - 如何填补这个余弦图的空白

java - 无法通过Java代码执行java -jar命令