在窗口中发送任意信号?

2022-09-01 06:12:29

Linux 支持使用 -Command 向进程发送任意 Posix 信号,例如 或 。虽然和只是无聊的旧方法,以友好或不那么友好的方式结束一个过程,但旨在触发核心转储。这可用于触发正在运行的 Java VM 以打印出线程转储,包括所有正在运行的线程的堆栈跟踪 - 整洁!打印调试信息后,Java VM将继续执行之前执行的操作;实际上,线程转储只是发生在另一个最大优先级的生成线程中。(您可以使用 自己尝试一下。)SIGINTSIGTERMkillSIGINTSIGTERMSIGQUITkill -3 <VM-PID>

请注意,您还可以使用(不支持! 和 -package 中的类,因此您可以使用它获得各种乐趣。SignalSignalHandlersun.misc

但是,我还没有找到一种方法来向Windows进程发送信号。信号由某些用户输入创建:例如,在两个平台上触发 a。但是,似乎没有任何实用程序可以手动向Windows上运行但非交互式进程发送信号。显而易见的解决方案是使用Cygwin可执行文件,但是虽然它可以使用适当的Windows API结束Windows进程,但我无法发送(Windows等同于)与它;实际上,我认为它能够发送到Windows进程的唯一信号是 。Ctrl-CSIGINTkillSIGBREAKSIGQUITSIGTERM

因此,长话短说并重复标题:如何向Windows中的进程发送任意信号?


答案 1

如果你想要的是显式/以编程方式杀死另一个程序/进程,那么在SysInternals的pstools中,有一个名为“pskill”的小工具,它的行为就像Unixen“kill”一样。

如果你想要别的东西,请继续阅读(尽管我可能在下面的一些细节上是错误的 - 自从我上次只使用WinAPI和Charles Petzold的优秀书籍“Programming for Windows”作为指南用C语言开发Windows程序以来,已经过去了很久)。

在Windows上,你没有正确的“信号”,WinMain和WinProc从操作系统接收的功能是简单的消息。例如,当您单击窗口的“X”按钮时,Windows会向该窗口的处理程序发送消息WM_CLOSE。当窗口被删除但程序仍在运行时,它会发送WM_DESTROY。当它即将退出主消息处理循环时,WinMain(不是 WinProc)会收到WM_QUIT。您的程序应该按预期响应所有这些 - 您实际上可以通过在收到WM_CLOSE时不执行应有的操作来开发“不可关闭”的应用程序。

当用户从Windows任务管理器中选择任务并单击“结束任务”时,操作系统将发送WM_CLOSE(以及我不记得的另一个)。但是,如果您使用“结束进程”,则该进程将被直接终止,并且永远不会发送任何消息(来源:The Old New Thing)

我记得有一种方法可以获取另一个进程窗口的HWND,一旦你得到另一个进程可以通过PostMessage和DispatchMessage函数向该窗口发送消息。


答案 2

Windows不是POSIX。它没有信号。控制台程序获得的唯一“信号”是它们是否调用 ,在这种情况下,可以通知用户已按 Ctrl+C、Ctrl+Break、关闭控制台窗口、注销或关闭系统。SetConsoleCtrlHandler

其他一切都是通过IPC完成的,通常使用窗口消息或RPC。查看 Sun 的文档,看看是否有办法在 Windows JRE 上执行您所要求的操作。


推荐