如何做一个“尊重”以前的控制台内容的C#Windows控制台应用程序?

和Vim一样:当它启动的时候会带你到另一个“缓冲区”。 当vimclosures时,用户会看到命令提示符的前一个内容。

有谁知道如何使用C#做到这一点?

谢谢

编辑:用户将不会再看到应用程序的输出。 希望能解释得更好。

我通过查看Vim源代码来了解这mch_init ,可以在mch_init函数的os_win32.c中找到相关位,我已经在这里复制并粘贴了相关位

  /* Obtain handles for the standard Console I/O devices */ if (read_cmd_fd == 0) g_hConIn = GetStdHandle(STD_INPUT_HANDLE); else create_conin(); g_hConOut = GetStdHandle(STD_OUTPUT_HANDLE); #ifdef FEAT_RESTORE_ORIG_SCREEN /* Save the initial console buffer for later restoration */ SaveConsoleBuffer(&g_cbOrig); g_attrCurrent = g_attrDefault = g_cbOrig.Info.wAttributes; #else /* Get current text attributes */ GetConsoleScreenBufferInfo(g_hConOut, &csbi); g_attrCurrent = g_attrDefault = csbi.wAttributes; #endif if (cterm_normal_fg_color == 0) cterm_normal_fg_color = (g_attrCurrent & 0xf) + 1; if (cterm_normal_bg_color == 0) cterm_normal_bg_color = ((g_attrCurrent >> 4) & 0xf) + 1; /* set termcap codes to current text attributes */ update_tcap(g_attrCurrent); GetConsoleCursorInfo(g_hConOut, &g_cci); GetConsoleMode(g_hConIn, &g_cmodein); GetConsoleMode(g_hConOut, &g_cmodeout); #ifdef FEAT_TITLE SaveConsoleTitleAndIcon(); /* * Set both the small and big icons of the console window to Vim's icon. * Note that Vim presently only has one size of icon (32x32), but it * automatically gets scaled down to 16x16 when setting the small icon. */ if (g_fCanChangeIcon) SetConsoleIcon(g_hWnd, g_hVimIcon, g_hVimIcon); #endif 

所以它只是保存控制台信息(包括标题和图标),然后在退出时再次恢复。

不幸的是, Console类没有提供对屏幕缓冲区内容的访问,所以要做到这一点,你需要将P / Invoke调入相关的Win32函数。

或者,Win32控制台实际上支持多个屏幕缓冲区 ,这可能是一个更简单的方法来实现这一点 – 而不是复制现有的屏幕缓冲区,只需使用CreateConsoleScreenBuffer创建一个新缓冲区,并使用SetConsoleActiveScreenBuffer将该缓冲区设置为当前显示的SetConsoleActiveScreenBuffer 。 不幸的是, Console类不支持多个屏幕缓冲区,所以你将需要P / Invoke来做到这一点。 此外, Console类总是写入启动应用程序时处于活动状态的屏幕缓冲区,因此,如果换出活动屏幕缓冲区, Console类仍将写入旧屏幕缓冲区(不再显示) -要解决这个问题,你需要P / Invoke你所有的控制台访问权限,请参阅在.NET中使用控制台屏幕缓冲区 。

您可以通过将旧内容写入控制台缓冲区来执行此操作,如下所述: 如何将快速彩色输出写入控制台?

我相信Vim会记录它打开的文件的历史记录,而且很可能也会像备份文件一样缓冲它们。 在C#中做同样的想法是实现一个文件缓冲区,某种类型的存储将记录和跟踪你想要的东西 – 输入参数等。

另外一个问题是,Vim(像Vi)有一个需要在C#中实现的命令模式。 现在这取决于你想用C#程序完成什么,是一个编辑器,那么很好,无论如何,你必须区分命令和其他模式。