如何在C#中使用GetConsoleDisplayMode?

时间:2018-02-20 23:55:36

标签: c# winapi pinvoke

背景

我正在使用C#中的控制台和PInvokes,只是为了看看当你不限制自己使用.NET框架时可以做些什么。我在Kernel32中偶然发现了一个名为GetConsoleDisplayMode的函数,该函数基本上可以让您查看控制台是以窗口,全屏还是硬件全屏模式运行。可以找到此功能的文档here

GetConsoleDisplayMode只接受一个参数:一个可以存储显示模式的LPDWORD。该函数返回一个bool,表示调用成功。 According to this documentation,LPDWORD是指向DWORD的指针,而DWORD只是一个32位无符号整数(C#中的 uint32 )。

因此,据我从文档中理解的是,这应该有效:

[DllImport("kernel32", EntryPoint = "GetConsoleDisplayMode", ExactSpelling = false, CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool GetConsoleDisplayMode(ref uint lpModeFlags);

static void Main(string[] args) {
    uint mode = 0;
    var success = GetConsoleDisplayMode(ref mode);

    Console.WriteLine(success);
    Console.WriteLine(mode);

    Console.ReadKey(true);
}

但是,该函数始终返回false!

我尝试了什么

当然,我试图修改代码,希望能让它正常工作。

对GetLastError()的调用返回最奇怪的错误代码3221684230,即使GoogleMicrosoft Documentation也不知道(也不是uint.MaxValue或int.MaxValue,我已经检查过)。这不会让我更进一步,所以我放弃了这个选项。

我尝试过的另一件事(希望我已经错误地阅读或理解了文档)正在将 ref 更改为 out ,它会传递一个未初始化的变量函数为我初始化:

[DllImport("kernel32", EntryPoint = "GetConsoleDisplayMode", ExactSpelling = false, CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool GetConsoleDisplayMode(out uint lpModeFlags);

static void Main(string[] args) {
    var success = GetConsoleDisplayMode(out var mode);
    if (!success) {
        Console.WriteLine(Kernel32.GetLastError());
    }

    Console.WriteLine(success);
    Console.WriteLine(mode);

    Console.ReadKey(true);
}

唉,这也是不成功的,有趣的是,会产生相同的错误代码。

我的问题(-s)

为什么我对GetConsoleDisplayMode的调用总是返回false,为什么GetLastError返回这样一个模糊的错误代码,最重要的是:我如何找到错误的错误和/或让它工作?

更多信息

我正在运行Windows 10 x64 build 1709(Fall Creators Update)。

John Paul Mueller关于Windows API和.NET框架的书中的this excerpt可能会有所帮助(这是我能找到的GetConsoleDisplayMode的最佳文档)。

0 个答案:

没有答案