Node.js 关闭 window 命令提示符(cmd) Console 控制台的快速编辑模式

windows 10 的 cmd 命令提示符下,如果你双击界面中的字符,则可能会发现可以快速选中部分文字,鼠标拖动模式也可以进行区域选择。

这是因为在 cmd 的选项配置中,默认开启了 “快速编辑模式”。但是可能你也会发现,控制台可能会在此时被卡住,本应继续执行的命令被暂停了,此时只有按一下回车键才会继续执行。

简单来说,“快捷编辑模式”方便了我们从命令提示符中快速选取和复制信息,但也可能因此导致程序频繁的意外卡住而暂停。如果避免这种意外发生呢?答案只能是禁用“快捷编辑模式”。

对于程序的使用者来说,只需要在命令提示符上“右键->属性”中取消其选中即可。

对于命令行程序的开发者来说可以怎么做?

在微软的控制台开发文档中,我们可以找到 SetConsoleMode 函数,通过它可以开启或关闭快速编辑模式。

然而 SetConsoleMode 只是 Win32 SDK 为 C 语言提供的控制台开发接口。在 nodejs 中有没有办法呢?

其实命令提示符属性选项的默认配置都是保存在注册表中的,所以可以通过读取或设置注册表项来修改它:

# 读取 QuickEdit 的设置
reg query HKEY_CURRENT_USER\\Console /v QuickEdit
# 设置 QuickEdit (关闭)
reg add HKEY_CURRENT_USER\\Console /v QuickEdit /t REG_DWORD /d 00000000 /f

我们知道 nodeJs 的 child_process.exec 方法可以用于执行 cmd 命令。那么我们就可以变通的实现关闭或开启快捷编辑模式了。

以下为一个示例:

const child_process = reuqire('child_process');
/** 开启或关闭 window 的快速编辑模式 */
const setQuickEdit = async (enable = false) => {
    if (process.platform !== 'win32') return;

    try {
        let cmd = 'reg query HKEY_CURRENT_USER\\Console /v QuickEdit';
        const quickEditSetting = await child_process.execSync(cmd);
        const isEnabled = quickEditSetting && String(quickEditSetting).trim().endsWith('1');
        // console.log(String(quickEditSetting).trim());
        if (isEnabled === enable) return;

        cmd = `reg add HKEY_CURRENT_USER\\Console /v QuickEdit /t REG_DWORD /d 0000000${enable ? '1' : '0'} /f`;
        await child_process.execSync(cmd);
        return true;
    } catch (err) {
        console.log(err);
        return false;
    }
};

注意,与 SetConsoleMode函数不同的是,SetConsoleMode 可以只设置当前 cmd 窗口,而以上方法只能实现全局性的开启或关闭“快速编辑模式”。

点赞 (0)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据