代码之家  ›  专栏  ›  技术社区  ›  morsch

在Windows中发送任意信号?

  •  25
  • morsch  · 技术社区  · 17 年前

    Linux支持发送任意Posix信号,例如 SIGINT SIGTERM 使用 kill 信号 西格特姆 只是以友好或不友好的方式结束一个过程的无聊的老方法, SIGQUIT kill -3 <VM-PID> .)

    Signal SignalHandler 课堂 sun.misc

    但是,我还没有找到一种方法向Windows进程发送信号。 信号由某些用户输入创建: Ctrl-C 触发 信号 可执行,但尽管它可以使用适当的Windows API结束Windows进程,但我无法发送 SIGBREAK (窗户相当于 )有了它;事实上,我认为它能够发送给Windows进程的唯一信号是 西格特姆

    6 回复  |  直到 17 年前
        1
  •  16
  •   Joe Pineda    15 年前

    如果您还想了解其他内容,请继续阅读(尽管我在下面的一些细节上可能是错误的-自从我上次使用WinAPI和Charles Petzold的优秀书籍“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
  •  9
  •   Mike Dimmick    17 年前

    Windows不是POSIX。它没有信号。控制台程序得到的唯一“信号”是它们是否调用 SetConsoleCtrlHandler

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

        3
  •  4
  •   Bob Nadler    17 年前

    在Windows中,一切都围绕着Win32消息。我不相信有一个命令行工具来做这件事,但是在C++中你可以使用 FindWindow 向另一个Windows程序发送任意消息。例如。:

    #define WM_MYMSG  ( WM_USER+0x100 )
    HWND h = ::FindWindow(NULL,_T("Win32App"));
    if (h) {
        ::PostMessage(h, WM_MYMSG, 0, 0);
    }
    

    这也可以在C#中使用com互操作来完成。

        4
  •  2
  •   Arty    5 年前

    SIGINT和其他信号可以使用 windows-kill ,按语法 windows-kill -SIGINT PID 哪里 PID pslist .

    this solution

        5
  •  1
  •   Steve K    17 年前

    您还可以使用jconsole查看所有运行线程的堆栈跟踪。这将适用于Windows和任何其他支持Java的操作系统。jconsole还具有许多其他优秀的特性,如内存图、cpu图等。

    如果您不熟悉jconsole,请查看 Using JConsole 文档

        6
  •  0
  •   Gustavo Carreno    17 年前

    PsTools 从现在起,微软拥有, SysInternals 我会帮你的。

        7
  •  0
  •   rogerdpack    9 年前

    Ruby能够在windows上(至少模拟)SIGINT-SIGKILL等,并捕获这些消息。我想看看。

    ruby如何在windows下“向该进程发送信号SIGINT”,实际上是调用 TerminateProcess 或在该PID上的等效值。

    还有一种与windows等效的“捕获ctrl+c”方法,我想这就是它在那里调用的方法。