C# 控制檯禁用快速編輯模式、在指定行更新文字、註冊Ctrl+C事件處理器

阿坦發表於2024-03-06

在第三行更新文字

程式碼如下

C# 控制檯禁用快速編輯模式、在指定行更新文字、註冊Ctrl+C事件處理器
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

相關文章