首页 > 编程语言 >[CSharpTips]C# 控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件

[CSharpTips]C# 控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件

时间:2023-12-16 14:23:27浏览次数:32  
标签:IntPtr C# System static CSharpTips 关闭 using mode

C# 控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleCloseTest
{
    internal class Program
    {

        //激活关闭窗口事件
        public delegate bool ControlCtrlDelegate(int CtrlType);
        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(ControlCtrlDelegate HandlerAppClose, bool Add);
        private static ControlCtrlDelegate cancelHandler = new ControlCtrlDelegate(HandlerAppClose);
        //取消控制台关闭按钮
        private const int MF_BYCOMMAND = 0x00000000;
        public const int SC_CLOSE = 0xF060;
        [DllImport("user32.dll")]
        public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);
        [DllImport("user32.dll")]
        public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
        [DllImport("kernel32.dll", ExactSpelling = true)]
        public static extern IntPtr GetConsoleWindow();
        //关闭控制台快速编辑模式
        const int STD_INPUT_HANDLE = -10;
        const uint ENABLE_QUICK_EDIT_MODE = 0x0040;
        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern IntPtr GetStdHandle(int hConsoleHandle);
        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint mode);
        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint mode);

        static void Main(string[] args)
        {

            //注册窗口关闭事件
            bool bRet = SetConsoleCtrlHandler(cancelHandler, true);
            //禁用关闭按钮
            IntPtr consoleWindow = GetConsoleWindow();
            IntPtr sysMenu = GetSystemMenu(consoleWindow, false);
            if (consoleWindow != IntPtr.Zero) DeleteMenu(sysMenu, SC_CLOSE, MF_BYCOMMAND);
            //关闭控制台快速编辑模式
            DisableQuickEditMode();
            Console.WriteLine("Func Main Called");
            Console.WriteLine("Enter 'exit' to exit the program ...");
            while (true)
            {
                Thread.Sleep(1);
                string s = Console.ReadLine();//一次输入一行
                if (s.ToUpper() == "EXIT") break;
            }
        }


        /// <summary>
        /// 打开快速编辑模式
        /// </summary>
        public static void EnableQuickEditMode()
        {
            IntPtr hStdin = GetStdHandle(STD_INPUT_HANDLE);
            uint mode;
            GetConsoleMode(hStdin, out mode);
            mode |= ENABLE_QUICK_EDIT_MODE;
            SetConsoleMode(hStdin, mode);
        }
        /// <summary>
        /// 关闭快速编辑模式
        /// </summary>
        public static void DisableQuickEditMode()
        {
            IntPtr hStdin = GetStdHandle(STD_INPUT_HANDLE);
            uint mode;
            GetConsoleMode(hStdin, out mode);
            mode &= ~ENABLE_QUICK_EDIT_MODE;
            SetConsoleMode(hStdin, mode);
        }

        /// <summary>
        /// 关闭窗口时的事件
        /// </summary>
        /// <param name="CtrlType"></param>
        /// <returns></returns>
        static bool HandlerAppClose(int CtrlType)
        {
            Console.WriteLine("关闭窗口事件被激活");
            Console.WriteLine("do something...");
            Thread.Sleep(5000);
            Environment.Exit(0);
            return false;
        }
    }
}

  

 

标签:IntPtr,C#,System,static,CSharpTips,关闭,using,mode
From: https://www.cnblogs.com/axiaoshuye/p/17904796.html

相关文章

  • Docker 安装
    1、在线安装1.1、卸载系统之前的dockersudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-logrotate\docker-engine1.2、安装Docker-ce安装必须的依赖sudoyuminstall-yyum-uti......
  • MySQL 8 社区版安装Percona的审计插件
    1.下载插件#tar-xvfPercona-Server-8.0.32-24-Linux.x86_64.glibc2.17-minimal.tar.gz#cdPercona-Server-8.0.32-24-Linux.x86_64.glibc2.17-minimal/lib/plugin#cpaudit_log.so/usr/local/mysql/lib/plugin/ 2.查看插件位置root@localhost(none)>showvariab......
  • 性能测试复习准备——linux环境下安装nacos-server-2.3.0.tar.gz
    参考:https://blog.csdn.net/henrin/article/details/130898186 参考:https://blog.csdn.net/weixin_59663288/article/details/125958594?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-125958594-blog-130898186.235^v39^p......
  • MongoDB 7.0 动态 WiredTiger tickets
    在WiredTiger存储引擎中,WiredTigertickets提供了并发控制机制。这些tickets分为读tickets和写tickets。当多个操作,比如读和写尝试并发访问数据库,WiredTiger使用tickets来确保这些操作不会冲突,从而保证数据的完整性和性能。WiredTiger中的"tickets"实际上是一种资源管理机制,用于限......
  • pt-table-checksum 使用介绍
    说明pt-table-checksum验证mysql复制的完整性。语法:pt-table-checksum[OPTIONS][DSN]pt-table-checksum通过在主节点上执行校验和查询来执行在线复制一致性检查,从而在与主节点不一致的从库上产生不同的结果。可选的DSN指定了主节点。如果发现任何差异,或出现任何警告或......
  • C++: 智能指针的自定义删除器 `Custom Deleter` 有什么用?
    C++11智能指针std::shared_ptr和std::unique_ptr都支持自定义删除器,本文将介绍自定义删除器的使用场景和使用方法。智能指针模板参数的第二个类型是删除器,一般是一个函数指针类型或者是一个函数对象类型。通常情况下,删除器的类型是std::default_delete<T>,它是一个函数对象类型,用于......
  • C++ 高效使用智能指针的8个建议
    C++高效使用智能指针的8个建议前言:智能指针是C++11提供的新特性,它基于RAII实现,可以自动管理内存资源,避免内存泄漏的发生,但是智能指针也并不是万能的,如果不正确使用智能指针,也会导致内存泄漏的发生,因此,我们需要了解如何高效使用智能指针避免一些可能的陷阱。本文总结了8个关于智......
  • Excel操作二
    冻结表中的单元格:(是一行或者一列数据始终在视角范围之内)光标选定要冻结的下一行,然后到冻结窗格去选择(行或者列)表格拆分给多行数据填充颜色第一:选择一行填充一个颜色第二:选择两行,作为例子等待复制第三:选择格式刷第四:同时按住“Ctrl”+“shift”+“↓”三个键填充如下:排序:有三种排......
  • 2023最新中级难度CSS3面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度CSS3面试题合集问:描述一下你对CSS盒模型的理解。CSS盒模型是一种用于描述元素布局和大小的方式。在HTML中,每个元素都可以看作是一个矩形框,这个框由内容(content)、填充(padding)、边框(border)和外边距(margin)组成。内容(Content):这......
  • vulnhub-wp Bsidesvancouver
    ......