ESC[2J和CLS在编程上有什么不同,我将如何使用Windows API在C中实现它?

ESC[2J和CLS在编程上有什么不同,我将如何使用Windows API在C中实现它?,c,windows,windows-console,ansi-escape,C,Windows,Windows Console,Ansi Escape,由于Windows 10现在支持VT100转义序列,我注意到序列ESC[2J和CLS在功能上是相同的,但是CLS会闪烁很多,而ESC[2J不会。下面是两个批处理文件作为一个简单的示例: 对于ESC[2J @ECHO OFF FOR /F %%A in ('ECHO prompt $E^| cmd') DO SET "ESC=%%A" FOR /L %%Q in () DO ( ECHO %ESC%[2J%ESC%[1;1HHi ) 对于CLS @ECHO OFF F

由于Windows 10现在支持VT100转义序列,我注意到序列ESC[2J和CLS在功能上是相同的,但是CLS会闪烁很多,而ESC[2J不会。下面是两个批处理文件作为一个简单的示例:

对于ESC[2J

@ECHO OFF
FOR /F %%A in ('ECHO prompt $E^| cmd') DO SET "ESC=%%A"
FOR /L %%Q in () DO (
    ECHO %ESC%[2J%ESC%[1;1HHi
)
对于CLS

@ECHO OFF
FOR /F %%A in ('ECHO prompt $E^| cmd') DO SET "ESC=%%A"
FOR /L %%Q in () DO (
    CLS
    ECHO %ESC%[1;1HHi
)
CLS one闪烁的次数明显增多。为什么会这样?它们在功能上的实现方式是否有差异?我之所以提出这个问题,是因为我正在使用C中的Windows控制台API创建一个小游戏。我正在使用此函数清除每个循环中的文本:

void clearScreen(HANDLE handle, enum ClearType type) {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (!GetConsoleScreenBufferInfo(handle, &csbi)) {
        printf("Unable to read Console Buffer Info!");
        exit(0);
    }
    DWORD charwritten;
    FillConsoleOutputCharacter(handle, ' ', csbi.dwSize.X * csbi.dwSize.Y, (COORD) {0, 0}, &charwritten);
}
但在一个循环中,结果与使用CLS相同:大量闪烁。我的问题是,有没有其他类似于ESC[2J(无闪烁)的方式来清除屏幕?我可以使用什么其他控制台功能

提前感谢,


LardPies

在批处理文件中,我认为差异是由于CLS后跟ECHO需要解析和执行两个不同的命令。您可以通过将第一批处理文件中的ECHO拆分为两行来测试该理论,即
ECHO%ESC%[2J
后跟
ECHO%ESC%[1;1HHi
@user3386109哇,你说得对。但即便如此,我如何使用控制台API在C中执行相同的操作?与第一批处理文件的效果相同?我将创建一个字符串,如
char clearMessage[]={27',[','2','J',27',[','1','1','H','\0'};
。然后创建一个大的缓冲区,例如
char buffer 1000]
。使用
strcpy
将字符串复制到缓冲区中,然后使用
strcat
将任何文本复制到该字符串的末尾。然后只需将字符串写入控制台即可。@user3386109这是我最初的想法,但如果我尝试使用多种颜色,那么我必须在每个字符之间放置SetConsoleAttributes艾克特,有更好的方法吗?谢谢