【发布时间】:2019-03-07 13:23:24
【问题描述】:
前段时间我注意到有一个新的控制台模式ENABLE_VIRTUAL_TERMINAL_PROCESSING,我决定尝试一下。这是我的示例代码:
// File: test1.c
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char * const TEST_STRING = "\x1B[31;1mRed\x1B[0m \x1B[32;1mGreen\x1B[0m \x1B[34;1mBlue\x1B[0m";
void ErrorExit(const char* errorMessage) {
puts(errorMessage);
exit(1);
}
int main(int argc, char** argv) {
if (argc != 2) {
ErrorExit("Usage: program (enable|disable|test|sample)");
}
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE), hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode;
char *cmd = argv[1];
if (!strcmp(cmd, "enable")) {
/*
GetConsoleMode(hInput, &dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_INPUT;
SetConsoleMode(hInput, dwMode);
*/
GetConsoleMode(hOutput, &dwMode);
dwMode |= ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOutput, dwMode)) {
ErrorExit("SetConsoleMode failed.");
}
}
else if (!strcmp(cmd, "disable")) {
/*
GetConsoleMode(hInput, &dwMode);
dwMode &= ~ENABLE_VIRTUAL_TERMINAL_INPUT;
SetConsoleMode(hInput, dwMode);
*/
GetConsoleMode(hOutput, &dwMode);
dwMode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOutput, dwMode)) {
ErrorExit("SetConsoleMode failed.");
}
}
else if (!strcmp(cmd, "test")) {
puts(TEST_STRING);
}
else if (!strcmp(cmd, "sample")) {
SetConsoleTextAttribute(hOutput, 0x0C);
printf("Red");
SetConsoleTextAttribute(hOutput, 0x07);
printf(" ");
SetConsoleTextAttribute(hOutput, 0x0A);
printf("Green");
SetConsoleTextAttribute(hOutput, 0x07);
printf(" ");
SetConsoleTextAttribute(hOutput, 0x09);
printf("Blue");
SetConsoleTextAttribute(hOutput, 0x07);
printf("\n");
}
else {
ErrorExit("Invalid command!");
}
return 0;
}
代码成功编译成test1.exe,但没有按预期工作:
我很确定我的其他一切都是正确的。我正在运行最新的 Windows 10 Enterprise 64 位,版本 10.0.17763.1。
我也试过了,但没有任何区别:
else if (!strcmp(cmd, "test")) {
DWORD dwNumber = strlen(TEST_STRING), dwWritten;
WriteConsole(hOutput, TEST_STRING, dwNumber, &dwWritten, NULL);
puts("");
}
那么为什么我的代码不工作(在运行test1 enable 之后,以test1 test 调用时仍然产生垃圾)?
【问题讨论】:
-
MS man page 说的是
ENABLE_VIRTUAL_TERMINAL_PROCESSING:当使用WriteFile或WriteConsole编写时,字符被解析为 VT100 和类似的控制字符序列,控制光标移动、颜色/字体模式以及其他也可以通过现有控制台 API 执行的操作(我的粗体字)。这会有所作为吗? -
@WeatherVane 我试过
WriteConsole(替换为puts)但没有任何区别。 -
当然
puts和printf是C库函数,最终都要调用WinAPIWriteFile或WriteConsole,最终进行NT系统调用如NtWriteFile和@987654340 @.
标签: c windows console windows-console