关闭控制台鼠标点击后调试信息阻塞的问题,附C#代码

在Win10下控制台输出调试信息的时候,常常碰到鼠标左键点击后调试信息不再输出的问题。
如下图所示,鼠标点击位置有个白色窄框。

此时,可以通过鼠标右键,或者Enter键退出,然后又可以看到调试信息输出正常了。
不太清楚其他Windows系统是否也有此现象, 有人说是Win10系统的一个bug。但我觉得这是一个调试的好帮手啊, 调试信息突突突奔涌根本看不清楚,这个时候鼠标点击下就可以暂停下来,然后慢慢看不是很爽? 这比再打开日志文件大面积查找更快速定位问题吧。

这里实际是控制台默认启用了“快速编辑”模式,不明白“快速编辑”模式可以参看这个:cmd命令行的插入模式和快速编辑模式

可以点击控制台左上角打开"属性"对话框,选项,编辑选项,去掉勾选"快速编辑",确定。此后,就不会发生这种调试信息输出阻塞现象啦。

手动禁用或启用

这个好说,就是"属性"对话框,选项,编辑选项,去掉勾选"快速编辑",或者勾选此选项启用

C#代码禁用

一般情况下,服务程序发布时可以使用如下代码关闭默认快速编辑功能。

`
//关闭cmd窗口默认为快速编辑(quick edit),解决控制台程序,鼠标点击暂停运行
//关闭此模式后,鼠标点击也不会进入快速编辑模式(即调试信息不会暂停输出)
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);

public static void EnableQuickEditMode()
{
IntPtr hStdin = GetStdHandle(STD_INPUT_HANDLE);
uint mode;
GetConsoleMode(hStdin, out mode);
mode |= ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
}

public static void DisableQuickEditMode()
{
IntPtr hStdin = GetStdHandle(STD_INPUT_HANDLE);
uint mode;
GetConsoleMode(hStdin, out mode);
mode &= ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
}

static void Main(string[] args)
{
Console.title = "这个是控制台标题,请勿关闭!";
DisableQuickEditMode();
}

`

批处理文件

批处理文件模式下,可以通过以下脚本关闭快速编辑模式

`
@echo off

reg add HKEY_CURRENT_USER\Console /v QuickEdit /t REG_DWORD /d 00000000 /f
`

posted @ 2021-12-10 16:12  devdog  阅读(736)  评论(0编辑  收藏  举报