1

我正在编写一个应用程序,并想打印带下划线的文本。我做错了什么?

我正在使用 C# 中的“翻译”代码,通常它在 C# 中效果很好,但在 C++ 中却不行。修复错误后,代码根本不起作用。它显示了一些通常不会显示的字符。这就是它打印的内容(https://i.imgur.com/V1X2uWk.png

这是我使用的代码

auto DllHandler = GetStdHandle(-11);
unsigned int Mode;
GetConsoleMode(DllHandler,PDWORD(Mode));
Mode |= 4;
SetConsoleMode(DllHandler,DWORD(Mode));
cout << "\x1b[5mUnderlined \x1b[0mtext" << endl;

这是原始(C#)代码:

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern IntPtr GetStdHandle(int nStdHandle);
    [DllImport("kernel32.dll")]
    public static extern IntPtr GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
    [DllImport("kernel32.dll")]
    public static extern IntPtr SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
        var DllHandler = Kernel32.GetStdHandle(-11);
        uint Mode;
        GetConsoleMode(DllHandler,out Mode);
        Mode |= 4;
        SetConsoleMode(DllHandler, Mode);
        Console.Write("\x1b[5mUnderlined \x1b[0mText");

提前致谢。

4

1 回答 1

1

就像@RbMm 说的,使用ULONG类型可以编译成功,达到预期的效果。

但真正造成错误的原因是指针传输的错误。如果要使用unsigned int,首先要申请指针,并为指针分配内存,然后在 中强制类型转换GetConsoleMode

    auto DllHandler = GetStdHandle(-11);
    unsigned int *Mode = new unsigned int;
    GetConsoleMode(DllHandler, PDWORD(Mode));
    *Mode = *Mode | 4;
    SetConsoleMode(DllHandler, DWORD(*Mode));
    cout << "\x1b[4mUnderlined \x1b[4mtext" << endl;

    delete Mode;
于 2019-05-27T07:36:11.390 回答