2010-07-14 37 views
9

Al trabajar con una aplicación de consola, se almacena un historial de todo lo que se ha ingresado en Console.ReadLine(). Cuando en el indicador de la consola para ingresar algo, al presionar el cursor arriba/abajo se desplazará por este historial (y se puede ver todo el historial presionando F7).¿Es posible borrar programáticamente el historial de la consola?

Al usar C#, ¿hay alguna forma de deshabilitar este comportamiento o borrar el historial de lo que ya se ha ingresado?


Para aclarar, Console.Clear() no borra el historial, sólo el búfer de pantalla. Quiero borrar el historial de comandos.


EDIT: Habiendo probado varios de los métodos sugeridos, así como algunos de mi propia invención, el mejor enfoque es la sugerida por HO1. No es ideal porque abre otra ventana de consola, pero borra el historial.

Respuesta

1

Editar: Eliminada la respuesta incorrecta (tengo confundido acerca de lo que quería hacer) y se añadió otra (con suerte) una mejor respuesta.

Es posible hacer esto liberando la consola actual usando FreeConsole y luego asignando una nueva consola usando AllocConsole. Asumiría que no mantendría la historia de línea de comando entonces.

En general, si usted quiere hacer las cosas con la consola no admitido por el .NET Framework, esta página de MSDN es un buen lugar para buscar: Console Functions

+0

No hace nada en la historia, me temo. – adrianbanks

+0

@adrianbanks: Sí, me confundí sobre lo que estabas haciendo (aunque al menos cometí un error diferente a las otras respuestas a esta pregunta :)). He actualizado mi respuesta con otra posible solución. –

4

¿Podría esta publicación en How can I configure the command line history, DOSKEY? ayudar?

En los viejos días de DOS, estaba disponible una utilidad, DOSKEY.EXE, que permitía al usuario pasar por los comandos anteriores. En NT esto está habilitado de forma predeterminada y puede pasar de un comando antiguo a otro, pero DOSKEY tiene otras capacidades.

Para borrar el comando línea histórica de comandos uso actual:

doskey /reinstall 

También puede indicar opcionalmente que el número de comandos de edad para mantener con el parámetro/listsize

doskey /reinstall /listsize=50 

mantendría a 50 comandos de edad .

Por favor, hágamelo saber si funciona y cómo se utiliza él :)

+0

Funciona en xp SP3. – mavnn

+0

Quiero hacer esto programáticamente desde mi propia aplicación de consola, así que no quiero depender de usar una herramienta externa. – adrianbanks

+1

¿Qué sucede si la misma funcionalidad proporciona la funcionalidad que busca suprimir? –

0

Usted podría intentar utilizando la propiedad

Console.BufferHeight : "This property defines the number of rows (or lines) stored in the buffer that is accessed by a console mode window" 
+0

Ya lo intenté, pero no me deja establecer un valor de cero. – adrianbanks

+0

BufferHeight es la ventana desplazable de todos los resultados de la consola. Es por eso que también hay BufferWidth. –

1

Tome un vistazo a SetConsoleHistoryInfo. De acuerdo con la documentación, solo funciona en Vista y más arriba, así que no estoy seguro de si te ayudará o no.

1

Este código me funciona para borrar el historial de comandos. Pruebas limitadas y sin garantías de portabilidad.

public static partial class ConsoleEx 
{ 
    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool SetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool GetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo); 

    [StructLayout(LayoutKind.Sequential)] 
    private class CONSOLE_HISTORY_INFO 
    { 
     public uint cbSize; 
     public uint BufferSize; 
     public uint BufferCount; 
     public uint TrimDuplicates; 
    } 

    public static void ClearConsoleHistory() 
    { 
     var chi = new CONSOLE_HISTORY_INFO(); 
     chi.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(CONSOLE_HISTORY_INFO)); 

     if (!GetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 

     var originalBufferSize = chi.BufferSize; 
     chi.BufferSize = 0; 

     if (!SetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 

     chi.BufferSize = originalBufferSize; 

     if (!SetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 
    } 
} 
+0

Se eliminó el manejo de errores y se reemplazó por devoluciones para mejorar la legibilidad del ejemplo del concepto. –

+0

Esta debería ser la respuesta correcta. Es el código administrado C# .NET que envuelve las llamadas de Win32 para lograr lo que necesita. El código Wrapper como este es necesario para llegar a la funcionalidad de la consola Win32 mediante programación, como alternar el ajuste EOL, centrar la consola en la pantalla, bloquear la actualización de la ventana, etc. – delrocco

Cuestiones relacionadas