如何禁用控制台窗口的关闭按钮?
2021-01-06 12:05
302 查看
这是一段古老的代码,也是我以前经常用到的代码。虽然现在和以后基本上都不会再用到它了,但是在特定的场景中,它很好用。
使用场景
有时候,我们需要编写一个具有一定处理逻辑的控制台程序,这比编写 Windows 服务要简单一些。但是,我们要防止不小心点击到控制台窗口右上角的关闭按钮而导致程序非正常退出。于是就有了如这篇文章标题所述的一个简单的需求。
代码实现
查找 Windows 窗口和禁用 Windows 窗口的按钮,需要用到 Windows API
FindWindow、
GetSystemMenu和
RemoveMenu,具体的代码实现如下所示,可以将代码复制到控制台项目中直接运行:
using System; using System.Runtime.InteropServices; using System.Threading; namespace Demo { class Program { static void Main(string[] args) { string title = $"程序 {DateTime.Now} 启动"; //修改控制台窗口标题 Console.Title = title; //禁用控制台窗口关闭按钮 DisableCloseButton(title); //检测指定 title 的控制台窗口是否存在 bool isExist = IsExistsConsole(title); Console.WriteLine($"isExist = {isExist},窗口标题:{title}"); Console.WriteLine("按回车键退出"); Console.ReadLine(); } #region 禁用控制台窗口关闭按钮 [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); ///<summary> /// 禁用控制台窗口关闭按钮 ///</summary> ///<param name="title">窗口标题</param> public static void DisableCloseButton(string title) { //线程休眠,确保能够正常 FindWindow,否则有时会 Find 失败。 Thread.Sleep(100); IntPtr windowHandle = FindWindow(null, title); IntPtr closeMenu = GetSystemMenu(windowHandle, IntPtr.Zero); const uint SC_CLOSE = 0xF060; RemoveMenu(closeMenu, SC_CLOSE, 0x0); } /// <summary> /// 检测指定 title 的控制台窗口是否存在 /// </summary> /// <param name="title">windows 窗口标题</param> /// <returns></returns> public static bool IsExistsConsole(string title) { IntPtr windowHandle = FindWindow(null, title); if (windowHandle.Equals(IntPtr.Zero)) return false; return true; } #endregion } }
它的运行结果如下:
总结
如上所述,代码很简单,实现的功能也很简单。只是觉得以后基本上不会再用到它了,聊以记之,以防永久遗忘。如若恰好对您有用,不胜荣幸。
作者 : 技术译民
出品 : 技术译站
相关文章推荐
- 如何禁用窗口关闭按钮在一个 MFC 多文档界面 (MDI) 应用程序
- WPF中如何禁用/去除窗口右上角的关闭按钮
- 如何禁用窗口关闭按钮在一个 MFC 多文档界面 (MDI) 应用程序
- WPF中如何禁用/去除窗口右上角的关闭按钮
- [WPF疑难]如何禁用窗口上的关闭按钮
- [WPF疑难]如何禁用窗口上的关闭按钮
- [WPF疑难]如何禁用窗口上的关闭按钮
- c# 禁用Excel窗口关闭按钮
- [总结] 如何判断IE窗口关闭和让IE6.0右上角的“闭关”按钮失效
- C# winform中窗口的关闭按钮的隐藏与禁用的几种方式说明
- 禁用form/窗口的关闭按钮(来自网上的vb代码)
- C# 禁用 关闭窗口 按钮的方法
- 如何实现“WinForm窗体禁用关闭按钮”方法功能及源代码
- C# winform中窗口的关闭按钮的隐藏与禁用的几种方式说明
- VS - 如何在控制台运行完毕后不会自动关闭窗口的方法
- VB2005中如何禁用窗体右上角的关闭按钮?
- 如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭?
- 各种“禁用窗口上的关闭按钮”方法总结及源码
- VC++无效化控制台窗口的关闭按钮
- 各种“禁用窗口上的关闭按钮”方法总结及源码