
如何禁用控制台窗口的关闭按钮?
发布日期:2021-05-09 03:41:34
浏览次数:10
分类:博客文章
本文共 2174 字,大约阅读时间需要 7 分钟。
这是一段古老的代码,也是我以前经常用到的代码。虽然现在和以后基本上都不会再用到它了,但是在特定的场景中,它很好用。
使用场景
有时候,我们需要编写一个具有一定处理逻辑的控制台程序,这比编写 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); ////// 禁用控制台窗口关闭按钮 /// ///窗口标题 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); } ////// 检测指定 title 的控制台窗口是否存在 /// /// windows 窗口标题 ///public static bool IsExistsConsole(string title) { IntPtr windowHandle = FindWindow(null, title); if (windowHandle.Equals(IntPtr.Zero)) return false; return true; } #endregion }}
它的运行结果如下:
总结
如上所述,代码很简单,实现的功能也很简单。只是觉得以后基本上不会再用到它了,聊以记之,以防永久遗忘。如若恰好对您有用,不胜荣幸。
作者 : 技术译民
出品 :
发表评论
最新留言
不错!
[***.144.177.141]2025年04月19日 21时27分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【科学计算】插值理论
2021-05-09
centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
2021-05-09
Java 读取Excel百分数保留原格式(即不转换为小数)的方法
2021-05-09
深度学习一:深度前馈网络和反向传播
2021-05-09
在wxPython使ListCtrl占据整个窗口
2021-05-09
微软面试题
2021-05-09
Google新玩法(转载)
2021-05-09
C#中Dispose和Close的区别!
2021-05-09
绝密:Google 秘密测试新版首页, 将闪聊嵌入搜索框下方!!
2021-05-09
如何让服务在流量暴增的情况下保持稳定输出
2021-05-09
一个20年技术老兵的 2020 年度技术总结
2021-05-09
EF保存平面数据到SqlServer
2021-05-09
一例完整的websocket实现群聊demo
2021-05-09
SQLSERVER数据库死锁与优化杂谈
2021-05-09
【Net】ABP框架学习之它并不那么好用
2021-05-09
Git 笔记
2021-05-09
Harbor 批量清理历史镜像
2021-05-09
使用Azure Functions玩转Serverless
2021-05-09
.NET Core 基于Websocket的在线聊天室
2021-05-09
我们真的需要JWT吗?
2021-05-09