如何将Ctrl-C消息传递给在Windows上运行的进程?

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

我很想知道关于如何将Ctrl-C消息传递给进程以及如何创建其他线程的内部结构?我想,即使我不订阅某个事件,它仍然会创建一个额外的线程并退出该进程.如何为应用程序设置处理Ctrl-C的认机制.

我是.net开发人员,但想了解Windows操作系统是如何工作的.以上问题仅仅是出于好奇学习Windows操作系统.

解决方法

当Windows需要通知控制台程序外部事件时,没有窗口消息循环发送通知,因此Windows将在目标进程中执行 create a thread以执行任何定义的回调函数. CTRL C事件的认处理程序只调用ExitProcess,但是挂钩CancelKeyPress事件会使用处理函数调用Win32 SetConsoleCtrlHandler函数.

handler function的文档解释了它的工作原理:

An application-defined function used with the SetConsoleCtrlHandler function. A console process uses this function to handle control signals received by the process. When the signal is received,the system creates a new thread in the process to execute the function.

请注意,Windows注入到您的进程中的线程具有相当小的堆栈,因此CLR处理程序例程实际上将Threadpool工作项排队以执行您的事件处理程序.这意味着Windows和工作线程注入的线程都可以创建,导致在处理CTRL C事件期间最多可以看到2个额外的线程.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...