You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中使用GetConsoleDisplayMode函数?

使用PInvoke调用Kernel32的GetConsoleDisplayMode(C#控制台实践)

最近我在C#控制台里折腾PInvoke,想跳出.NET框架的限制探索更多可能性,偶然发现了Kernel32里的GetConsoleDisplayMode函数——它能帮我们快速判断控制台当前处于窗口模式、全屏模式还是硬件全屏模式。

函数基础介绍

这个函数非常简洁,仅接受一个参数:LPDWORD类型的变量(在C#里我们用out uint来对应),用来存储返回的显示模式标志位。函数本身返回布尔值,true表示调用成功,false则是调用失败,这时候可以通过Windows API的错误码排查问题。

C# PInvoke实现代码

直接上可运行的代码示例,里面包含了函数声明、模式常量定义和调用逻辑:

using System;
using System.Runtime.InteropServices;

class ConsoleDisplayChecker
{
    // 导入Kernel32中的GetConsoleDisplayMode函数
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool GetConsoleDisplayMode(out uint displayMode);

    // 对应官方定义的显示模式常量
    private const uint CONSOLE_WINDOWED = 0x00000001;
    private const uint CONSOLE_FULLSCREEN = 0x00000002;
    private const uint CONSOLE_FULLSCREEN_HARDWARE = 0x00000004;

    static void Main()
    {
        if (GetConsoleDisplayMode(out uint mode))
        {
            Console.WriteLine("当前控制台显示模式:");
            // 按位判断模式,因为可能存在多个标志位(不过通常是单一模式)
            if ((mode & CONSOLE_WINDOWED) != 0)
                Console.WriteLine("- 窗口模式");
            if ((mode & CONSOLE_FULLSCREEN) != 0)
                Console.WriteLine("- 全屏模式(软件模拟)");
            if ((mode & CONSOLE_FULLSCREEN_HARDWARE) != 0)
                Console.WriteLine("- 硬件全屏模式(直接调用显示硬件)");
        }
        else
        {
            int error = Marshal.GetLastWin32Error();
            Console.WriteLine($"调用失败,错误码:{error}");
        }
    }
}

代码关键点说明

  • PInvoke声明:[DllImport]特性用来引入非托管的Windows API,SetLastError = true让我们能在调用失败后通过Marshal.GetLastWin32Error()获取具体的错误码,方便调试。
  • 模式常量:这三个常量是官方定义的标志位,displayMode变量是按位存储这些标志的,所以要用按位与运算来判断当前激活的模式。
  • 错误处理:调用失败时一定要获取错误码,比如权限不足、控制台句柄无效等情况都会导致调用失败。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:17:58