我正在寻找一种方式来触发控制台应用程序手动关闭(用户关闭窗口)时的一段代码。已经尝试过:“在退出”的控制台应用程序
AppDomain.CurrentDomain.ProcessExit +=
new EventHandler(CurrentDomain_ProcessExit);
但是如果手动关闭,上述功能不起作用。
是否有任何方式使用.Net调用这个或我需要导入内核的DLL并以这种方式吗?
我正在寻找一种方式来触发控制台应用程序手动关闭(用户关闭窗口)时的一段代码。已经尝试过:“在退出”的控制台应用程序
AppDomain.CurrentDomain.ProcessExit +=
new EventHandler(CurrentDomain_ProcessExit);
但是如果手动关闭,上述功能不起作用。
是否有任何方式使用.Net调用这个或我需要导入内核的DLL并以这种方式吗?
您需要挂钩到控制台退出事件而不是您的进程。
http://geekswithblogs.net/mrnat/archive/2004/09/23/11594.aspx
此代码工作吸引用户关闭控制台窗口:
using System;
using System.Runtime.InteropServices;
class Program {
static void Main(string[] args) {
handler = new ConsoleEventDelegate(ConsoleEventCallback);
SetConsoleCtrlHandler(handler, true);
Console.ReadLine();
}
static bool ConsoleEventCallback(int eventType) {
if (eventType == 2) {
Console.WriteLine("Console window closing, death imminent");
}
return false;
}
static ConsoleEventDelegate handler; // Keeps it from getting garbage collected
// Pinvoke
private delegate bool ConsoleEventDelegate(int eventType);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
}
当心的限制。您有已有对此通知作出快速响应,您需要5秒才能完成此任务。花更长的时间,Windows将毫不客气地杀死你的代码。而且你的方法在工作线程上被异步调用,程序的状态是完全不可预知的,因此可能需要锁定。确保中止不会造成麻烦。例如,将状态保存到文件中时,确保先保存到临时文件并使用File.Replace()。
你通过“手动关闭”是否意味着用户点击控制台窗口右上角的“关闭窗口”十字? – 2011-01-10 12:34:28
我怀疑你所在的是命令行本身的“On Exit”。一旦控制台应用程序的Main方法完成,它就无法控制,用户需要按Enter键关闭命令行窗口。 – 2011-01-10 12:45:13
@Martin。是的,这就是我的意思。将更新以澄清。 – BlueVoodoo 2011-01-10 12:55:47