控制台 快速編輯模式


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM