如何在不填充屏幕的情况下清除屏幕

13

是否存在中断服务程序以帮助我清除终端屏幕?它在Windows上能正常工作吗?


目标环境是什么?Windows还是MSDOS? - wallyk
1
16位还是32位?文本模式还是图形模式? - Greg Hewgill
我们正在使用x86仿真器,因此我认为是16位环境,在文本模式下。 - kettlepot
4个回答

22

通过BIOS(int 10h,AH = 0)设置图形模式会清除屏幕。

通过BIOS(int 10h,AH = 6或7)将屏幕向上或向下滚动也可以清除屏幕。

这仅适用于可以调用BIOS服务功能的地方。

在MSDOS中,这将始终起作用。

在Windows中,这仅适用于DOS应用程序,并且如果Windows实际上可以运行它们。64位版本的Windows根本不支持DOS应用程序,从Windows Vista开始,即使在32位版本的Windows中,许多DOS应用程序也无法完全工作。

还要记住,如果DOS应用程序在Windows窗口中运行,只有该窗口将被清除,而不是整个屏幕。


谢谢,int 10,0 完美地运行了。你有没有想过如何在32/64位控制台应用程序中实现它?只是打印几个空格吗? - kettlepot
如果它是32位的DPMI DOS应用程序,你仍然可以使用BIOS函数。除此之外,你就没有办法了。BIOS在64位模式下不起作用。DOS也一样。 - Alexey Frunze

11

2
mov ax, 0x0003 然后 int 0x10 在 MacOS、bochs 和 nasm 上都可以运行。 - Jony

2
在汇编语言中,尝试这样做:
mov ah, 0x06
mov al, 0
int 10h

不,你不能在Windows上这样做。这段代码只能用于bootloader和汇编内核(仅限16位,警告:请勿尝试32位!)

如果你想在Windows上实现(控制台应用程序),那么可以尝试以下方法:

C++

//YOU SHOULD INCLUDE STDIO.H and CONIO.H. You should also type:
//using namespace std

system("cls");

VB.NET

//You should imports System and other Default namespaces
shell("cls")

C#

System.Diagnostics.Proccess.Start("CMD.exe /c cls");

注意:我认为我们无法使用C#或VB创建控制台应用程序。当然,我从未尝试过。只是说一下而已。但这些代码仅适用于Windows。


从技术上讲,如果您在32位Windows上运行此代码,则可以运行已编译和链接为16位的汇编代码。它将通过NTVDM运行,该程序允许您运行16位Windows和DOS应用程序以及一些32位DOS应用程序。支持许多BIOS和DOS中断,并且对视频模式有一些限制。一般的例外情况是任何可能危及安全性的内容。在64位Windows上,您需要一个仿真器或虚拟机。 - Michael Petch
3
有趣的是,在QEMU上使用汇编方法只清除了第一个字符。 - adrian

2

针对 Windows 控制台应用程序,在纯 C 代码中:

#include <tchar.h>
#include <wincon.h>

VOID
ClearScreen(HANDLE hConsoleOutput)
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    COORD coPos;
    DWORD dwWritten;

    GetConsoleScreenBufferInfo(hConsoleOutput, &csbi);

    coPos.X = 0;
    coPos.Y = 0;
    FillConsoleOutputAttribute(hConsoleOutput, csbi.wAttributes,
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coPos, &dwWritten);
    FillConsoleOutputCharacter(hConsoleOutput, TEXT(' '),
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coPos, &dwWritten);
    SetConsoleCursorPosition(hConsoleOutput, coPos);
}

...

// In your main code:
/* Clear the full console screen */
ClearScreen(hOutput);

其中hConsoleOutput是指向控制台屏幕缓冲区的句柄(通过GetStdHandle(STD_OUTPUT_HANDLE)CreateConsoleScreenBuffer(...)或其他方式获取)。

该函数的作用是首先检索当前控制台屏幕缓冲区信息(包含其当前大小),然后使用默认文本属性和空格填充完整的屏幕缓冲区,最后将光标放置在 (0,0)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接