diff --git a/SCADA/Program/BatchCoreTest/Program.cs b/SCADA/Program/BatchCoreTest/Program.cs index 55e9ef3..54b66d4 100644 --- a/SCADA/Program/BatchCoreTest/Program.cs +++ b/SCADA/Program/BatchCoreTest/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; using System.ServiceModel; namespace BatchCoreService @@ -11,6 +12,8 @@ namespace BatchCoreService static void Main() { BatchCoreTest srv = new BatchCoreTest(); + ConsoleUtil.RegisterCloseConsoleHandle();//注册控制台关闭事件,注意,只有执行该该操作,事件 + ConsoleUtil.ClosedConsole += (sender, e) => srv.Dispose(); Console.ReadLine(); } } @@ -47,4 +50,130 @@ namespace BatchCoreService } } } + + 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 + { + /// + /// 当用户关闭Console + /// + CloseEvent = 2, + /// + /// Ctrl+C + /// + CtrlCEvent = 0, + /// + /// 用户退出(注销) + /// + LogoffEvent = 5, + /// + /// Ctrl+break + /// + CtrlBreakEvent = 1, + /// + /// 系统关闭 + /// + ShutdownEvent = 6, + } } diff --git a/SCADA/dll/OPCDriver.dll b/SCADA/dll/OPCDriver.dll index be689d7..aeba942 100644 Binary files a/SCADA/dll/OPCDriver.dll and b/SCADA/dll/OPCDriver.dll differ