1 /* 2 * 控制臺禁用關閉按鈕并最小化到系統(tǒng)托盤演示 3 * 4 * 通過ConsoleWin32類來進行控制 5 * 添加引用 System.Runtime.InteropServices; 和 System.Threading; 用于禁用關閉按鈕 6 * 添加引用 System.Drawing; 和 System.Windows.Forms; 用于系統(tǒng)托盤 7 * 8 * Original By Bruceli 9 * Complete By Ay 10 */ 11 12 using System; 13 using System.Collections.Generic; 14 using System.Linq; 15 using System.Text; 16 using System.Runtime.InteropServices; 17 using System.Threading; 18 using System.Drawing; 19 using System.Windows.Forms; 20 using System.Diagnostics; 21 22 23 24 class Program 25 { 26 public static bool Runing = true; 27 28 [STAThread] 29 static void Main(string[] args) 30 { 31 Console.Title = "ConsoleEx"; 32 33 ConsoleWin32Helper.Initialization(); 34 ConsoleWin32Helper.ShowNotifyIcon(); 35 ConsoleWin32Helper.DisableCloseButton(); 36 37 Thread threadWork = new Thread(new ThreadStart(MyWork.EntryPoint)); 38 threadWork.Start(); 39 40 41 ConsoleWin32Helper.Visable = false; 42 43 while (Runing) 44 { 45 Application.DoEvents(); 46 } 47 48 ConsoleWin32Helper.HideNotifyIcon(); 49 threadWork.Abort(); 50 } 51 } 52 53 class ConsoleWin32Helper 54 { 55 public static void Initialization() 56 { 57 NotifyIconInitialization(); 58 } 59 60 #region 句柄實用工具 61 62 [DllImport("User32.dll", EntryPoint = "FindWindow")] 63 static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 64 65 [DllImport("user32.dll", EntryPoint = "GetSystemMenu")] 66 static extern IntPtr GetSystemMenu(IntPtr hWnd, IntPtr bRevert); 67 68 [DllImport("user32.dll", EntryPoint = "RemoveMenu")] 69 static extern IntPtr RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags); 70 71 [DllImport("user32.dll")] 72 static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow); 73 74 private class __mc_IWin32Window : IWin32Window 75 { 76 public IntPtr Handle { get; private set; } 77 public __mc_IWin32Window(IntPtr handle) 78 { 79 Handle = handle; 80 } 81 } 82 83 /// <summary>自動尋找當前控制臺句柄</summary> 84 public static IntPtr GetConsoleWindowHandle() 85 { 86 //線程睡眠,確保closebtn中能夠正常FindWindow,,否則有時會Find失敗。,。 87 Thread.Sleep(100); 88 89 lock (Console.Title) 90 { 91 var newtitle = Guid.NewGuid().ToString(); 92 var orgtitle = Console.Title; 93 Console.Title = newtitle; 94 95 IntPtr handle = FindWindow(null, Console.Title); 96 97 Console.Title = orgtitle; 98 99 return handle; 100 } 101 } 102 103 /// <summary>禁用關閉按鈕</summary> 104 public static void DisableCloseButton() 105 { 106 IntPtr closeMenu = GetSystemMenu(GetConsoleWindowHandle(), IntPtr.Zero); 107 uint SC_CLOSE = 0xF060; 108 RemoveMenu(closeMenu, SC_CLOSE, 0x0); 109 } 110 111 /// <summary>自動尋找當前控制臺句柄,并封裝成Winform對象</summary> 112 public static IWin32Window GetConsoleWindowHandleObj() 113 { 114 return new __mc_IWin32Window(GetConsoleWindowHandle()); 115 } 116 117 static void HiddenConsoleWindow() 118 { 119 uint SW_HIDE = 0; 120 ShowWindow(GetConsoleWindowHandle(), SW_HIDE); 121 } 122 123 static void ShowConsoleWindow() 124 { 125 uint SW_SHOW = 5; 126 ShowWindow(GetConsoleWindowHandle(), SW_SHOW); 127 } 128 129 static bool _Visable = true; 130 public static bool Visable 131 { 132 get { return _Visable; } 133 set 134 { 135 _Visable = value; 136 if (_Visable) 137 ShowConsoleWindow(); 138 else 139 HiddenConsoleWindow(); 140 } 141 } 142 143 #endregion 144 145 #region 托盤圖標 146 147 static NotifyIcon _NotifyIcon = new NotifyIcon(); 148 149 private static void NotifyIconInitialization() 150 { 151 _NotifyIcon.Icon = Properties.Resources.MainIcon; 152 _NotifyIcon.Visible = false; 153 _NotifyIcon.Text = Console.Title; 154 155 ContextMenuStrip menu = new ContextMenuStrip(); 156 menu.RenderMode = ToolStripRenderMode.System; 157 158 ToolStripMenuItem item = new ToolStripMenuItem(); 159 item.Name = "exit"; 160 item.Text = "退出"; 161 menu.Items.Add(item); 162 163 item = new ToolStripMenuItem(); 164 item.Name = "open"; 165 item.Text = "打開瀏覽器"; 166 menu.Items.Add(item); 167 168 169 _NotifyIcon.ContextMenuStrip = menu; 170 171 menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_ItemClicked); 172 173 _NotifyIcon.MouseDoubleClick += new MouseEventHandler(_NotifyIcon_MouseDoubleClick); 174 } 175 176 public static void ShowNotifyIcon() 177 { 178 _NotifyIcon.Visible = true; 179 _NotifyIcon.ShowBalloonTip(3000, "", "我是托盤圖標,,用右鍵點擊我試試,還可以雙擊看看,。", ToolTipIcon.None); 180 } 181 182 public static void HideNotifyIcon() 183 { 184 _NotifyIcon.Visible = false; 185 } 186 187 static void _NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) 188 { 189 Console.WriteLine("托盤被雙擊."); 190 Visable = !Visable; 191 } 192 193 static void menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 194 { 195 Console.WriteLine("托盤菜單被點擊"); 196 Console.WriteLine("被點擊的菜單是:{0}", e.ClickedItem.Text); 197 switch (e.ClickedItem.Name) 198 { 199 case "exit": 200 Program.Runing = false; 201 break; 202 case "open": 203 Process.Start(MyWork.SVR_URL); 204 break; 205 } 206 } 207 208 #endregion 209 } |
|