有時,公司內部自己開發的控制台(console)應用程序在服務器上運行會因為遇到某些異常自動關閉了,這就需要用某機制來捕獲控制台(console)關閉事件,把這樣寫日志,便於維護和調試。
源碼如下:
程序代碼
Code
1using System;
2using System.Runtime.InteropServices;
3using System.Threading;
4using System.Diagnostics;
5
6namespace xmlpusher
7{
8 public delegate bool ConsoleCtrlDelegate(int dwCtrlType);
9 /**//// <summary>
10 /// Class1 的摘要說明。
11 /// </summary>
12 class Class1
13 {
14 //The SetConsoleCtrlHandler function adds or removes an application-defined HandlerRoutine function
15 //from the list of handler functions for the calling process.
16 [DllImport("kernel32.dll")]
17 private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
18 //一個Ctrl + C的信號被接收,該信號或來自鍵盤,或來自GenerateConsoleCtrlEvent 函數
19 private const int CTRL_C_EVENT = 0;
20 //一個 Ctrl + Break 信號被接收,該信號或來自鍵盤,或來自GenerateConsoleCtrlEvent 函數
21 private const int CTRL_BREAK_EVENT = 1;
22 //當用戶系統關閉Console時,系統會發送此信號到此
23 private const int CTRL_CLOSE_EVENT = 2;
24 //當用戶退出系統時系統會發送這個信號給所有的Console程序。該信號不能顯示是哪個用戶退出。
25 private const int CTRL_LOGOFF_EVENT = 5;
26 //當系統將要關閉時會發送此信號到所有Console程序
27 private const int CTRL_SHUTDOWN_EVENT = 6;
28 /**//// <summary>
29 /// 應用程序的主入口點。
30 /// </summary>
31 [STAThread]
32 static void Main(string[] args)
33 {
34 //
35 // TODO: 在此處添加代碼以啟動應用程序
36 //
37 Class1 cl = new Class1();
38 }
39
40 public Class1()
41 {
42 ConsoleCtrlDelegate newDategate = new ConsoleCtrlDelegate(HandlerRoutine);
43 bool re = SetConsoleCtrlHandler(newDategate, true);
44 if (re)
45 {
46 Console.WriteLine("Set SetConsoleCtrlHandler success!!");
47 }
48 else
49 {
50 Debug.WriteLine("Set SetConsoleCtrlHandler Error!!");
51 AsReportFile.WriteFile("","test.txt","who close?");
52 }
53 Console.ReadLine();
54 }
55
56 bool HandlerRoutine(int CtrlType)
57 {
58 switch (CtrlType)
59 {
60 case CTRL_CLOSE_EVENT:
61 for (int i = 0; i < 100; i++)
62 {
63 Console.WriteLine("i is:{0}", i);
64 Thread.Sleep(1000);
65 }
66 break;
67 }
68 return false;
69 }
70 }
71}
72
73