参照一些资料做一个响应Console关闭的功能。
public delegate bool ConsoleCtrlDelegate(int ctrlType);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool add);ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine);
bool re = SetConsoleCtrlHandler(newDelegate, true);
if (re)
Console.WriteLine("OK");
else
Console.WriteLine("ERROR");private bool HandlerRoutine(int CtrlType)
{
Console.WriteLine("aaa");
}
但是每次关闭Console的时候总是没有执行HandlerRoutine中的内容就报错了。
怀疑是不是因为在程序中启动了很多子线程导致的?
请高手帮忙指教
public delegate bool ConsoleCtrlDelegate(int ctrlType);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool add);ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine);
bool re = SetConsoleCtrlHandler(newDelegate, true);
if (re)
Console.WriteLine("OK");
else
Console.WriteLine("ERROR");private bool HandlerRoutine(int CtrlType)
{
Console.WriteLine("aaa");
}
但是每次关闭Console的时候总是没有执行HandlerRoutine中的内容就报错了。
怀疑是不是因为在程序中启动了很多子线程导致的?
请高手帮忙指教
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 }
但是编译成.exe后就出现问题了。高手请指点一下
1、委托要做成类成员,而不是局部变量(防止被垃圾回收)。
2、下面代码是经过测试(包括独立exe)的,你可以参考一下。
3、C++中的BOOL其实是int类型,下面代码直接用了int。
using System;
using System.Runtime.InteropServices;
// should add a reference to System.Windows.Formsclass Program
{
static ConsoleCtrlDelegate handler; //<--- static void Main(string[] args)
{
handler = ConsoleCtrHandler;
SetConsoleCtrlHandler(handler, true); while (true)
{
Console.ReadLine();
}
}
static int ConsoleCtrHandler(ConsoleEvent e)
{
System.Windows.Forms.MessageBox.Show( e.ToString() );
return 1;
} enum ConsoleEvent
{
Ctrl_C,
Ctrl_Break,
Close,
Logoff,
Shutdown
} delegate int ConsoleCtrlDelegate(ConsoleEvent ctrlType); [DllImport("kernel32.dll", CallingConvention=CallingConvention.StdCall)]
static extern int SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool add);
}