背景
我正在使用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,即使Google和Microsoft 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的最佳文档)。