控制台 快速编辑模式

复制代码
/// <summary>
        /// 快速编辑模式是一种很便捷的操作方式:左键选中,右键复制以及右键从剪贴板粘贴内容等
        /// 如果鼠标选中控制台界面上的内容,控制台就被阻塞了
        /// 在Windows Server 2012 及Windowns 8以上,控制台窗口的程序默认是打开“快速编辑模式”的开关的。
        /// 注册表HKEY_CURRENT_USER\Console的QuickEdit可控制全局是否打开“快速编辑模式”模式,0:不打开,1:打开
        /// 在某些场景下,控制台打印输出的时候,不系统阻塞导致程序卡住,但是windows不能针对所有命令行统一设置,只能单个程序去设置
        /// 此时,可使用如下方式:
        /// </summary>
        public static void DisableConsoleQuickEdit()
        {
            var handle = GetStdHandle(StdHandle.InputHandle);
            uint mode;
            GetConsoleMode(handle, out mode);
            ConsoleModes newMode = (ConsoleModes)mode;
            if ((newMode & ConsoleModes.ENABLE_QUICK_EDIT_MODE) == ConsoleModes.ENABLE_QUICK_EDIT_MODE)
                newMode ^= ConsoleModes.ENABLE_QUICK_EDIT_MODE;
            if ((newMode & ConsoleModes.ENABLE_INSERT_MODE) == ConsoleModes.ENABLE_INSERT_MODE)
                newMode ^= ConsoleModes.ENABLE_INSERT_MODE;
            if ((newMode & ConsoleModes.ENABLE_MOUSE_INPUT) == ConsoleModes.ENABLE_MOUSE_INPUT)
                newMode ^= ConsoleModes.ENABLE_MOUSE_INPUT;
            SetConsoleMode(handle, (uint)newMode);
        }

        public static bool SetConsoleFont(uint index)
        {
            return SetConsoleFont(GetStdHandle(StdHandle.OutputHandle), index);
        }

        [DllImport("kernel32")]
        public static extern IntPtr GetStdHandle(StdHandle index);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);

        /// <summary>
        /// https://docs.microsoft.com/en-us/windows/console/setconsolemode?redirectedfrom=MSDN
        /// </summary>
        /// <param name="hConsoleHandle">控制台输入缓冲区或控制台屏幕缓冲区的句柄</param>
        /// <param name="lpMode">模式</param>
        /// <returns></returns>
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);

        [DllImport("kernel32")]
        private extern static bool SetConsoleFont(IntPtr hOutput, uint index);

        public enum StdHandle
        {
            OutputHandle = -11,
            InputHandle = -10,
            ErrotHandle = -12,
        }

        [Flags]
        private enum ConsoleModes : uint
        {
            ENABLE_PROCESSED_INPUT = 0x0001,
            ENABLE_LINE_INPUT = 0x0002,
            ENABLE_ECHO_INPUT = 0x0004,
            ENABLE_WINDOW_INPUT = 0x0008,
            ENABLE_MOUSE_INPUT = 0x0010,
            ENABLE_INSERT_MODE = 0x0020,
            ENABLE_QUICK_EDIT_MODE = 0x0040,
            ENABLE_EXTENDED_FLAGS = 0x0080,
            ENABLE_AUTO_POSITION = 0x0100,

            ENABLE_PROCESSED_OUTPUT = 0x0001,
            ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002,
            ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004,
            DISABLE_NEWLINE_AUTO_RETURN = 0x0008,
            ENABLE_LVB_GRID_WORLDWIDE = 0x0010
        }
复制代码

 

posted @   lcawen  阅读(2290)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示