控制台 快速编辑模式

/// <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
        }

猜你喜欢

转载自www.cnblogs.com/lcawen/p/12742916.html
今日推荐