2017-06-15 66 views
2

这不是重复的! - 看完评论后,也许就是了。SetConsoleMode失败,为零,lasterror = 0

我一直在寻找一种方式,以斜体在控制台应用程序的控制台输出文本,在C#,Visual Studio的2015年,瞄准的.NET Framework 4.5.2,OS = Windows 7的

微软文档是很清楚

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

我发现与做什么,我想弗拉基米尔尼科夫解决以下问题,

adding text decorations to console output

在其中一个答案回答3月28日在19:52和代码像它在Git中,和其他地方......我的问题是 - 自然 - 它不适合我。

我复制作者的轻微MODS的代码为以下控制台应用程序

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是必需的。

+0

这只适用于W8或更高版本。 – Gusman

+1

https://stackoverflow.com/questions/38772468/setconsolemode-and-enable-virtual-terminal-processing – Gusman

+0

@Gusman在Windows 8.1上不适用于我。你的意思是Windows 10? – GSerg

回答

1

确保勾选“使用原有的控制台”傍控制台属性的底部没有设置:

Console Properties

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

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

+0

好复查,弗拉德。谢谢! –

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上。

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

+1

“Windows 2000及更高版本”中提供的是SetConsoleMode函数 - 这几乎是正确的,因为Windows 2000是当前最早的“受支持”里程碑,即使对于自Windows 95以后的函数,它也会显示。所以这一部分是正确的,但他们确实忘记了为个别常量指示不同的支持水平,就像他们为例如[SystemParametersInfo](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724947(V = vs.85)的.aspx)。可以作为文档错误报告。 – GSerg

相关问题