如何在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
相关产品推荐
相关产品推荐

