SetConsoleMode失败,为零,lasterror = 0

时间:2017-06-15 18:14:56

标签: c# formatting console-application

这不是重复的! - 好吧,看完评论后,也许是。

我一直想在控制台应用程序的控制台输出中使用c#,Visual Studio 2015,Targeting .NET Framework 4.5.2,OS = Windows 7来斜体化文本。

Microsoft文档非常清楚

这是here - 这是误导,这是错误的。这是一个操作系统问题。

我找到了以下问题,解决方案符合Vladimir Reshetnikov的要求,

adding text decorations to console output

在3月28日19:52回答了其中一个答案,并在git和其他地方编写了代码......我的问题是 - 自然 - 它对我不起作用。

我将使用次要mod的作者代码复制到以下控制台应用程序

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        const int STD_OUTPUT_HANDLE = -11;
        const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4;

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr GetStdHandle(int nStdHandle);

        [DllImport("kernel32.dll")]
        static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);

        [DllImport("kernel32.dll")]
        static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);

        static void Main()
        {
            var handle = GetStdHandle(STD_OUTPUT_HANDLE);
            uint mode;
            GetConsoleMode(handle, out mode);
            mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
            SetConsoleMode(handle, mode);

            const string UNDERLINE = "\x1B[4m";
            const string RESET = "\x1B[0m";
            Console.WriteLine("Some " + UNDERLINE + "underlined" + RESET + " text");
            Console.ReadLine();
        }
    }
}

我在窗口中获取VT命令,而不是下划线,如文章中那样。

这是我的控制台窗口:Console Window

我已经从ConsoleSetMode中获取了返回值 - 它为零。我用lasterror = 6看到了这个失败,但这里的lasterror是0。

认为这是最近的更新? ... 或者其他的东西? [编辑]这是一个Windows版本问题 - 显然,Windows 10 AU是必需的。

3 个答案:

答案 0 :(得分:1)

确保复选框"使用传统控制台"未设置控制台属性底部附近:

Console Properties

如果您没有看到此复选框,那么您可能正在使用过旧版本的Windows。

您可以使用注册表项HKCU\Console\ForceV2以编程方式操作此复选框,如this answer中所述。

答案 1 :(得分:0)

确定。这是重复的 - 有点像。在Gusman提到的问题的答案中,SetConsoleMode() and ENABLE_VIRTUAL_TERMINAL_PROCESSING?(我找不到,但应该有) - 此功能仅适用于Windows 10(以及更多...根据TamásDeme'tomzorz ',仅在Windows 10 AU之上或之后),尽管微软声称它可以在Windows 2000“及更高版本”上使用。

所以,答案是:它不起作用,除了Windows 10之外不会起作用,在Windows 7被从地球上移除之前这是一个死胡同,并且它不可能必须通过QC Windows 7.

到那时,法律将禁止控制台应用程序。

答案 2 :(得分:0)

需要更多错误检查。

private static readonly IntPtr InvalidHandle = new IntPtr(-1);

handle = GetStdHandle(STD_OUTPUT_HANDLE);
if (handle == InvalidHandle) {
    throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}
if (!GetConsoleMode(handle, out uint mode)) {
    throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(handle, mode)) {
    throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}