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