首页 > 编程语言 >C# 控制台禁用快速编辑模式、在指定行更新文本、注册Ctrl+C事件处理器

C# 控制台禁用快速编辑模式、在指定行更新文本、注册Ctrl+C事件处理器

时间:2024-03-06 11:48:02浏览次数:14  
标签:Console Ctrl C# consoleMode System int static using 控制台

在第三行更新文本

 

代码如下

using Microsoft.Win32.SafeHandles;
using System;
using System.Runtime.InteropServices;
using System.Threading;

class Program
{
    [DllImport("kernel32.dll")]
    static extern SafeFileHandle GetStdHandle(int nStdHandle);

    [DllImport("kernel32.dll")]
    static extern bool GetConsoleMode(SafeFileHandle hConsoleHandle, out uint lpMode);

    [DllImport("kernel32.dll")]
    static extern bool SetConsoleMode(SafeFileHandle hConsoleHandle, uint dwMode);

    const int STD_INPUT_HANDLE = -10; // 标准输入设备(键盘)

    // 常量定义
    const uint ENABLE_QUICK_EDIT_MODE = 0x0040; // 快速编辑模式标识位

    static void DisableQuickEditMode()
    {
        var stdin = GetStdHandle(STD_INPUT_HANDLE);
        uint consoleMode;
        if (!GetConsoleMode(stdin, out consoleMode))
        {
            throw new System.IO.IOException("Failed to get console mode.");
        }

        // 清除快速编辑模式标志
        consoleMode &= ~ENABLE_QUICK_EDIT_MODE;

        // 设置新的控制台模式
        if (!SetConsoleMode(stdin, consoleMode))
        {
            throw new System.IO.IOException("Failed to set console mode.");
        }
    }

    static bool IsEnd = false;
    static void Main()
    {
        // 安装Ctrl+C事件处理器
        Console.CancelKeyPress += Console_CancelKeyPress;

        DisableQuickEditMode();//快速编辑模式已禁用,点击鼠标将不会暂停程序

        string[] progressStatuses = { "加载中...", "正在处理数据...", "即将完成..." };

        int index = 0;

        int targetLine = 2; // 假设我们想在第三行(索引从0开始)更新文本

        while (true)
        {
            // 获取当前窗口宽度以覆盖整行
            int windowWidth = Console.WindowWidth;

            // 移动光标到目标行行首
            Console.SetCursorPosition(0, targetLine);

            // 写入足够的空格来清除当前行内容
            Console.Write(new string(' ', windowWidth-1));

            // 移动光标到当前行首
            Console.SetCursorPosition(0, Console.CursorTop);

            // 覆盖现有内容,显示新的状态信息
            Console.Write(progressStatuses[index]);

            // 更改状态(模拟进度)
            index = (index + 1) % progressStatuses.Length;

            // 暂停一段时间以观察效果
            Thread.Sleep(1000);

            if (IsEnd)
                break;
        }
        Console.WriteLine("\n终止程序");
        Console.WriteLine("请按任意键结束");
        Console.ReadKey();

    }

    private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        IsEnd = true;

        // 如果你希望阻止程序退出,取消默认行为
        e.Cancel = true; // 设置为true则阻止程序终止

        //// 最后可以选择手动退出程序
        //Environment.Exit(0);
    }
}
View Code

 

标签:Console,Ctrl,C#,consoleMode,System,int,static,using,控制台
From: https://www.cnblogs.com/lizhiqiang0204/p/18056180

相关文章

  • 【C++】判断一颗二叉树是否对称
    四步法:(1)如果两个子树都为空指针,则它们相等或对称(2)如果两个子树只有一个为空指针,则它们不相等或不对称(3)如果两个子树根节点的值不相等,则它们不相等或不对称(4)根据相等或对称要求,进行递归处理。//四步法判断一颗二叉树是否对称//主函数boolisSymmetric(TreeNode*root){......
  • (译) 理解 Prometheus 的范围向量 (Range Vector)
    Prometheus中RangeVector的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档。谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机去寻找一篇像本文一样的文章去理解这个概念,不是吗?什么是Vector由于Prometheus是一个时序型的......
  • C#通义千问apl
    1.在阿里申请和开通模型服务灵积:链接地址2.在gitee下载代码:Gitee链接3.在代码中更换你的API-KEY4.注意要开通:通义千问/qwen-turbo模型5.如图所示......
  • 借助 Terraform 功能协调部署 CI/CD 流水线-Part 1
    在当今快节奏的开发环境中,实现无缝、稳健的CI/CD流水线对于交付高质量软件至关重要。在本文中,我们将向您介绍使用BitbucketPipeline、ArgoCDGitOps和AWSEKS设置部署的步骤,所有步骤都将利用Terraform的强大功能进行编排。在Part1里,将主要介绍通过Terraform创建和部署......
  • php 将png 转成 ico
    publicfunctiontest(){//定义PNG文件路径$pngFile='sdbz.png';//创建一个空白的ICO图像$ico=imagecreatetruecolor(32,32);imagealphablending($ico,false);imagesavealpha($ico,true);$tr......
  • 从 HPC 到 AI:探索文件系统的发展及性能评估
    随着AI技术的迅速发展,模型规模和复杂度以及待处理数据量都在急剧上升,这些趋势使得高性能计算(HPC)变得越来越必要。HPC通过集成强大的计算资源,比如GPU和CPU集群,提供了处理和分析大规模数据所需的算力。然而,这也带来了新的挑战,尤其是在存储系统方面,包括如何有效处理大量数据......
  • 【C++】二叉树的前序、中序、后序遍历(递归、非递归)
    #include<vector>#include<iostream>#include<string>usingnamespacestd;//二叉树的定义structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(inta):val(a),left(NULL),right(NULL){}};//使用递归进行前序遍历voidpreoder(Tr......
  • php发送curl请求
    收藏地址https://blog.csdn.net/lmp5023/article/details/102585153get请求//初始化$curl=curl_init();//设置抓取的urlcurl_setopt($curl,CURLOPT_URL,'http://www.baidu.com');//设置头文件的信息作为数据流输出curl_setopt($curl,CURLOPT_HEADER,1);//设......
  • 【C++】求二叉树的最大深度和最小深度
    //求一颗二叉树的最大深度求高度:后序遍历求深度:前序遍历intmaxDepth(TreeNode*root){returnroot?1+max(maxDepth(root->left),maxDepth(root->right)):0;}//求一颗二叉树的最小深度(实质上是后序遍历)intminDepth(TreeNode*root){if(!root)retur......
  • leedcode 位1的数量
    自己写的classSolution:defhammingWeight(self,n:int)->int:#将整数n转换为二进制字符串,去除前缀'0b'n_str=bin(n)[2:]#用于存储'1'的列表res_li=[]#遍历二进制字符串的每一位foriinn_str:......