C消息传递给在Windows上运行的进程?

我创建了一个C#控制台应用程序,通过将它订阅到Console.CancelKeyPress事件来处理Ctrl-C。 当我执行(调试版本)应用程序时,已经创建了14个线程。 当我按下Ctrl-C时,创建了一个新的第15个线程,并调用了我的处理程序。 我使用sysinternals的进程管理器来查看进程的状态。

我很想知道关于如何将Ctrl-C消息传递给进程以及如何创建附加线程的内部机制? 我猜,即使我没有订阅一个事件,它仍然会创建一个额外的线程并退出该过程。 如何为应用程序设置处理Ctrl-C的默认机制。

我是一名.NET开发人员,但希望了解Windows操作系统如何工作。 以上问题只是出于好奇才学习windows操作系统。


当Windows需要通知一个外部事件的控制台程序时,没有窗口消息循环来发送通知,所以Windows将在目标进程中创建一个线程来执行定义的任何回调函数。 CTRL + C事件的默认处理程序只是调用ExitProcess ,但挂钩CancelKeyPress事件会使用处理函数调用Win32 SetConsoleCtrlHandler函数。

处理函数的文档解释了它的工作原理:

与SetConsoleCtrlHandler函数一起使用的应用程序定义的函数。 控制台进程使用此功能来处理进程收到的控制信号。 当接收到信号时,系统在过程中创建一个新线程来执行该功能。

请注意,Windows注入进程的线程堆栈非常小,因此CLR处理程序实际上将一个Threadpool工作项排队以执行您的事件处理程序。 这意味着可以创建由Windows注入的线程和工作线程,从而在处理CTRL + C事件期间最多可以看到2个附加线程。


是的,Windows启动一个线程来调用由SetConsoleCtrlHandler()注册的处理程序。 它由一个名为ControlCHooker的内部辅助类的Hook()方法调用。 这由Cancel.CancelKeyPress事件的add()访问器调用。 Windows回调使您的事件处理程序运行。

像Reflector或ILSpy这样的反汇编器以及Reference Source可以帮助您发现这些实现细节。

链接地址: http://www.djcxy.com/p/56635.html

上一篇: C message delivered to a process running on windows?

下一篇: Selenium IDE: How to select next available date from datepicker