using System;
using System.Runtime.InteropServices;
using System.ServiceModel;
namespace BatchCoreService
{
static class Program
{
static void Main()
{
BatchCoreTest srv = new BatchCoreTest();
ConsoleUtil.RegisterCloseConsoleHandle();
ConsoleUtil.ClosedConsole += (sender, e) => srv.Dispose();
Console.ReadLine();
}
}
public class BatchCoreTest : IDisposable
{
ServiceHost serviceHost = null;
public BatchCoreTest()
{
if (serviceHost != null)
{
serviceHost.Close();
}
serviceHost = new ServiceHost(typeof(DAService));
serviceHost.Open();
}
public void Dispose()
{
if (serviceHost != null)
{
serviceHost.Close();
serviceHost = null;
}
}
}
public static class ConsoleUtil
{
#region 禁用控制台关闭按钮
public static void DisableCloseButton()
{
DisableCloseButton(Console.Title);
}
public static void DisableCloseButton(string consoleName)
{
IntPtr windowHandle = FindWindow(null, consoleName);
IntPtr closeMenu = GetSystemMenu(windowHandle, IntPtr.Zero);
uint scClose = 0xF060;
RemoveMenu(closeMenu, scClose, 0x0);
}
#region API
[DllImport("User32.dll", EntryPoint = "FindWindow")]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "GetSystemMenu")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, IntPtr bRevert);
[DllImport("user32.dll", EntryPoint = "RemoveMenu")]
static extern IntPtr RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);
#endregion
#endregion
#region 捕捉控制台关闭事件
public delegate bool ConsoleCtrlDelegate(int ctrlType);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate handlerRoutine, bool add);
public static void RegisterCloseConsoleHandle()
{
SetConsoleCtrlHandler(OnClosedConsole, true);
}
public static event EventHandler ClosedConsole;
private static bool OnClosedConsole(int ctrlType)
{
if (ClosedConsole != null)
{
var e = new CloseConsoleEventArgs((CloseConsoleCategory)ctrlType);
ClosedConsole("Console", e);
return e.IsCancel;
}
return false;
}
#endregion
}
public class CloseConsoleEventArgs : EventArgs
{
public CloseConsoleEventArgs()
{
}
public CloseConsoleEventArgs(CloseConsoleCategory category)
{
Category = category;
}
public CloseConsoleCategory Category { get; set; }
public bool IsCancel { get; set; }
}
public enum CloseConsoleCategory
{
CloseEvent = 2,
CtrlCEvent = 0,
LogoffEvent = 5,
CtrlBreakEvent = 1,
ShutdownEvent = 6,
}
}