发送/捕获 SIGTERM 的 Win32 API 模拟

Posted

技术标签:

【中文标题】发送/捕获 SIGTERM 的 Win32 API 模拟【英文标题】:Win32 API analog of sending/catching SIGTERM 【发布时间】:2010-11-16 01:13:47 【问题描述】:

在 POSIX OS 下,有一个信号 API,允许向进程发送信号以将其关闭 使用 kill ,您可以使用 sigaction 捕获它并执行您需要的操作;

但是,Win32 不是 POSIX 系统,所以:

如何处理可能出现的关闭事件,例如来自“任务管理器”中的“结束进程”? 向 Win32 应用程序发送关机信号的标准 API 是什么?

我不是在谈论 GUI,我在谈论应该很好地关闭的 TCP/IP 服务器。 像 Windows 服务一样运行。

【问题讨论】:

【参考方案1】:

MSDN Unix 代码迁移指南有一章是关于 Win32 code conversion and signal handling。 尽管 Microsoft 已决定将这份出色的指南存档,但它非常有用。

描述了三种方法: 原生信号 事件对象 消息

【讨论】:

【参考方案2】:

您在第一个创建的线程上收到WM_QUIT 消息。

如果你不处理,你的进程会被强制关闭。

所以只需在你的第一个线程中实现一个消息队列,它会查找WM_QUIT 消息

【讨论】:

您应该处理 WM_CLOSE。 “WM_QUIT 消息与窗口无关,因此永远不会通过窗口的窗口过程接收。它只能由 GetMessage 或 PeekMessage 函数检索。” -MSDN 我可以对控制台 Ctrl+C 和作为 Windows 服务运行的进程使用相同的方法吗?或者我应该对它们中的每一个使用不同的方法? 您可以使用 taskkill /im your_program.exe 向应用程序发送终止信号。正如@Indy9000 所提到的,它将在 Windows 消息队列中触发 WM_CLOSE【参考方案3】:

MSDN 的 Windows 电源管理可能会有所帮助。但它处理的是系统事件而不是每个进程。

对于进程,您可以使用WM_CLOSE 检测终止。您需要处理 Windows 消息。如果它是一个控制台应用程序,您需要安装一个控制处理程序;看看 MSDN 上的SetConsoleCtrlHandler

【讨论】:

以上是关于发送/捕获 SIGTERM 的 Win32 API 模拟的主要内容,如果未能解决你的问题,请参考以下文章

python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入

程序对我在 Python 中使用 win32api 发送的消息没有反应

如何修复“ah00169:捕获 SIGTERM,正在关闭”错误?

使用win32api检查背景上是否按下了键

Win32Api -- 关闭当前应用

Kill