gpt4 book ai didi

c - 我怎样才能 ENABLE_VIRTUAL_TERMINAL_PROCESSING?

转载 作者:可可西里 更新时间:2023-11-01 14:22:02 30 4
gpt4 key购买 nike

前段时间我注意到有一个新的控制台模式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,但没有按预期运行:

screenshot

我相当确定其他一切都是正确的。我运行的是最新的 Windows 10 企业版 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 调用时仍然产生垃圾)?

最佳答案

问题是,您使用 SetConsoleMode() 所做的设置只会影响正在运行的进程(和潜在的子进程)。这意味着,它实际上并不是命令行窗口的设置,也没有“传回”给父 shell 进程。您必须在执行输出之前直接设置它,即:

else if (!strcmp(cmd, "test")) {
GetConsoleMode(hOutput, &dwMode);
dwMode |= ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOutput, dwMode)) {
ErrorExit("SetConsoleMode failed.");
}
puts(TEST_STRING);
}

这应该会如您所愿地工作。

关于c - 我怎样才能 ENABLE_VIRTUAL_TERMINAL_PROCESSING?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52607960/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com