2011-08-07 8 views
19

He escrito una aplicación de consola, que es esencialmente una Console.ReadLine() - Loop. Cuando la aplicación está esperando la entrada, presionando la tecla de flecha hacia arriba recorre todas las líneas de entrada anteriores. Mi aplicación no contiene ningún código para esta función. ¿Qué parte de Windows proporciona esto? ¿Cómo puedo desactivarlo?¿Por qué mi aplicación de consola tiene historial de comandos?

Solo puedo visualizar que sea una característica del subsistema de la consola o implementado en Console.ReadLine().

Aquí hay un código de ejemplo que muestra el comportamiento descrito:

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input; 
      do 
      { 
       input = System.Console.ReadLine(); 
      } while (input != "exit"); 
     } 
    } 
} 

me gustaría desactivar la función de la historia por ahora, y ejecutarla de nuevo más tarde usando mi propio código. El comportamiento actual es muy limitado.

+0

Lo único que encontré es esto - http://www.clearallhistory.com/clear-run-history.html. No es una solución ideal, pero podrías borrar la historia quizás antes de pedir información. El efecto secundario es que borra el historial de cualquier comando que abra en la máquina. – arunkumar

+0

También me sorprendió lo que me sucedió a mí, pero estoy totalmente satisfecho con esto. "increíble", pensé. Pero ahora quiero interceptar la pestaña para completarla y parece que puedo perder esa característica si necesito obtener las claves una por una a mano. Característica fresca pero no extensible, parece. Además, ¿por qué no recorrer todo el camino e implementar la búsqueda del historial de Ctrl-R? MS .... –

+0

¡REALMENTE, acabo de descubrir accidentalmente que la consola admite F8 (bash Ctrl + r) y F9 (bash! N)! esto es maravilla absoluta, de repente, felicitaciones MS. http://ss64.com/nt/syntax-keyboard.html –

Respuesta

20

puede cambiar este comportamiento de las ventanas de programación llamando SetConsoleHistoryInfo con una correcta configuración CONSOLE_HISTORY_INFO estructura ... no parece haber ninguna clase/método de gestión por lo que tendrá que utilizar DllImport etc.

http://msdn.microsoft.com/en-us/library/ms686031%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms682077%28v=VS.85%29.aspx

si es necesario - varios otros aspectos de la consola puede ser manejado de una manera administrada - ver c# console, Console.Clear problem

+0

+1 De alguna manera debo haber perdido esa función API. Ya tenía esa página abierta :-) Creo que no voy a molestarme en intentar desactivar la función después de todo. Prefiero usar mi propio procesamiento de entrada usando ReadKey(). Esto debería esquivar completamente el historial. – TheFogger

4

La función de historial está integrada en el shell de comandos de Windows, no es una característica de su aplicación. AFAIK no hay manera de deshabilitar esto en su código ya que es específico del entorno del shell de Windows (a menos que haya una configuración que se puede cambiar, que probablemente exista)

Posiblemente podría anular el comportamiento predeterminado utilizando un detector de teclas para obtenga todas las pulsaciones de teclas con la flecha hacia arriba y ejecute su propio código, de esta forma el evento no se despliega hasta el shell para manejarlo.

+1

¿Alguien lee más que la primera respuesta? Sheesh. – x0n

+0

Bueno, la cuestión es que su respuesta realmente no le da una manera de hacer lo que realmente quiere, ya que él quiere controlar las cosas programáticamente desde mi comprensión. Esa es solo una solución para su configuración. Lo ideal es que quiera su PROPIA implementación del historial de comandos, ya que dice que le gustaría implementarlo con su propio código. –

+0

Me encanta el downvote y las 3 respuestas que son casi exactamente iguales. Buen trabajo chicos –

4

Sí, esta es una característica del subsistema de la consola, no su aplicación. Para cambiarlo, haga clic en el cuadro de control de la consola (arriba a la izquierda), propiedades, pestaña de opciones: "Historial de comandos". El valor predeterminado es 50 elementos, 4 almacenamientos intermedios. Supuestamente, esto se puede configurar programáticamente con DOSKEY desde la línea de comandos, pero unos pocos retoques no me llevaron a ningún lado.

ALT+F7 borrará el historial de comandos, al igual que ejecutar el comando DOSKEY /reinstall. He probado en Windows 7.

Actualización: El correspondiente llamada a la API de Win32 es SetConsoleHistoryInfo y el p/invocar la firma se puede encontrar en http://pinvoke.net/default.aspx/kernel32/SetConsoleHistoryInfo.html

0

No se ha probado, pero parece que el paso de una instancia de CONSOLE_HISTORY_INFO a SetConsoleHistoryInfo con el tamaño del búfer y el recuento establecen en 1 haría dar el mismo control que el diálogo de propiedades de la ventana de la consola.

definiciones P/Invoke en pinvoke.net

También tenga en cuenta esta requiere Windows V6 o posterior (es decir. Vista/2008/7/2008R2).

Cuestiones relacionadas