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

前端之家收集整理的这篇文章主要介绍了如何将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&C++相关文章