using Microsoft.Win32.SafeHandles; using System; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using static SystemX.Net.Platform.Common.Util.LogMessage; namespace SystemX.Net.Platform.Common.Util { public static class ConsoleUtil { static bool ConsoleShowState = false; const int SW_HIDE = 0; const int SW_SHOW = 5; // STD_INPUT_HANDLE (DWORD): -10 is the standard input device. const int STD_INPUT_HANDLE = -10; /// /// SC_CLOSE /// private const uint SC_CLOSE = 0xf060; /// /// MF_ENABLED /// private const uint MF_ENABLED = 0x00000000; /// /// MF_GRAYED /// private const uint MF_GRAYED = 0x00000001; [DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll")] static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); [DllImport("kernel32.dll")] static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); #region 시스템 메뉴 구하기 - GetSystemMenu(windowHandle, revert) /// /// 시스템 메뉴 구하기 /// /// 윈도우 핸들 /// 메뉴 복사 핸들 여부 /// 시스템 메뉴 핸들 [DllImport("user32.dll")] private static extern IntPtr GetSystemMenu(IntPtr windowHandle, bool revert); #endregion #region 메뉴 항목 이용 가능 여부 설정하기 - EnableMenuItem(menuHandle, menuItemID, enabled) /// /// 메뉴 항목 이용 가능 여부 설정하기 /// /// 메뉴 핸들 /// 메뉴 항목 ID /// 이용 가능 여부 /// 처리 결과 [DllImport("user32.dll")] private static extern bool EnableMenuItem(IntPtr menuHandle, uint menuItemID, uint enabled); #endregion public static void ConsoleVisibleControl() { var handle = GetConsoleWindow(); if (ConsoleShowState) ConsoleHide(handle); else ConsoleShow(handle); } public static void ConsoleHide() { var handle = GetConsoleWindow(); var consoleHandle = GetStdHandle(STD_INPUT_HANDLE); const uint ENABLE_QUICK_EDIT = 0x0040; const uint ENABLE_MOUSE_INPUT = 0x0010; uint consoleMode = 0x0; // get current console mode if (!GetConsoleMode(consoleHandle, out consoleMode)) { // Error: Unable to get console mode. return; } // Clear the quick edit bit in the mode flags consoleMode &= ~ENABLE_QUICK_EDIT; consoleMode &= ~ENABLE_MOUSE_INPUT; // set the new mode if (!SetConsoleMode(consoleHandle, consoleMode)) { //ERROR: Unable to set console mode return; } // Hide ShowWindow(handle, SW_HIDE); ConsoleShowState = false; } public static void ConsoleHide(IntPtr handle) { // Hide ShowWindow(handle, SW_HIDE); ConsoleShowState = false; } public static void ConsoleShow(IntPtr handle) { // Show SetCloseButtonEnabled(handle, false); ShowWindow(handle, SW_SHOW); ConsoleShowState = true; } private static void SetCloseButtonEnabled(IntPtr windowHandle, bool enabled) { IntPtr systemMenuHandle = GetSystemMenu(windowHandle, false); EnableMenuItem(systemMenuHandle, SC_CLOSE, (uint)(MF_ENABLED | (enabled ? MF_ENABLED : MF_GRAYED))); } } public static class CommonUtil { public static string GetProfilePath(string programName = "", bool makeDirOnDemand = true) { var xProfilePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var dir = String.Format(@"{0}\TESTApp\{1}", xProfilePath, programName); if (makeDirOnDemand && !Directory.Exists(dir)) Directory.CreateDirectory(dir); return dir; } public static PropertyInfo GetProperty(object obj, string propName) { return obj.GetType().GetProperty(propName); } public static void ClonePropertyValues(T original, T clone) { foreach (_PropertyInfo info in original.GetType().GetProperties()) SetPropertyValue(clone, info.Name, info.GetValue(original, null)); } public static T GetPropertyValue(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); } public static void SetPropertyValue(object obj, string propName, object value) { obj.GetType().GetProperty(propName).SetValue(obj, value, null); } public static Type GetType(string strType) { try { Type typeResult = Type.GetType("System." + strType, true, true); return typeResult; } catch (Exception ex) { MessageOutput.ConsoleWrite("Type Recognition Error: " + ex.Message, ConsoleColor.Red, LogMessageLevel.FATAL); return null; } } public static Type GetType(Assembly assy, string strNameSpace, string strType) { try { string strFullName = $"{strNameSpace}." + strType; Type typeResult = Type.GetType(strFullName, true, true); return typeResult; } catch (Exception ex) { MessageOutput.ConsoleWrite("Type Recognition Error: " + ex.Message, ConsoleColor.Red, LogMessageLevel.FATAL); return null; } } public static string GetStringFromASCII(int[] arrData, bool bReverseBit = false) { string sData = string.Empty; foreach (short s in arrData) { byte[] intBytes = BitConverter.GetBytes(s); byte ucRever; if (bReverseBit) { ucRever = intBytes[0]; intBytes[0] = intBytes[1]; intBytes[1] = ucRever; } foreach (byte b in intBytes) { if (b == 0) continue; sData += ((Char)b).ToString(); // Ascii To Char } } return sData; } public static short[] HexStringToBytes(string hexString) { if (hexString.Length % 2 != 0) hexString += "\0"; char[] result = hexString.ToCharArray(); short[] arrShort = new short[hexString.Length / 2]; byte[] bytes = new byte[hexString.Length]; for (int i = 0; i < result.Length; i++) bytes[i] = Convert.ToByte(result[i]); for (int i = 0; i < bytes.Length; i += 2) arrShort[i / 2] = BitConverter.ToInt16(bytes, i); return arrShort; } } public partial class NativeMethods { [DllImportAttribute("kernel32.dll", SetLastError = true, EntryPoint = "CreateFile")] public static extern SafeFileHandle CreateFileW( [InAttribute()][MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, uint dwDesiredAccess, uint dwShareMode, [InAttribute()] System.IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, [InAttribute()] System.IntPtr hTemplateFile ); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr CreateFile( [MarshalAs(UnmanagedType.LPTStr)] string filename, [MarshalAs(UnmanagedType.U4)] FileAccess access, [MarshalAs(UnmanagedType.U4)] FileShare share, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes, IntPtr templateFile); } public partial class NativeConstants { /// GENERIC_WRITE -> (0x40000000L) public const int GENERIC_WRITE = 1073741824; public const uint GENERIC_READ = 2147483648; /// FILE_SHARE_DELETE -> 0x00000004 public const int FILE_SHARE_DELETE = 4; /// FILE_SHARE_WRITE -> 0x00000002 public const int FILE_SHARE_WRITE = 2; /// FILE_SHARE_READ -> 0x00000001 public const int FILE_SHARE_READ = 1; /// OPEN_ALWAYS -> 4 public const int OPEN_ALWAYS = 4; public const int CREATE_NEW = 1; } }