2010-07-14 2 views
9

Wenn Sie mit einer Konsolenanwendung arbeiten, wird eine Historie von allem gespeichert, was unter Console.ReadLine() eingegeben wurde. Wenn an einer Eingabeaufforderung der Konsole etwas eingegeben wird, wird durch Drücken des Auf-/Ab-Cursors durch diesen Verlauf geblättert (und der gesamte Verlauf kann durch Drücken von F7 angezeigt werden).Ist es möglich, den Konsolenverlauf programmatisch zu löschen?

Mit C# gibt es eine Möglichkeit, dieses Verhalten zu deaktivieren oder den Verlauf der bereits eingegebenen Daten zu löschen.


Um zu klären, ist Console.Clear() nicht die Geschichte zu löschen, nur den Bildschirmpuffer. Ich möchte den Befehlsverlauf löschen.


EDIT: mehrere der vorgeschlagenen Methoden versucht haben, sowie einige meiner eigenen Planens, der beste Ansatz ist die von ho1 vorgeschlagen. Es ist nicht ideal, weil es ein anderes Konsolenfenster öffnet, aber es macht die Geschichte frei.

Antwort

1

Edit: um eine falsche Antwort (ich habe verwirrt darüber, was Sie tun wollte) und fügte hinzu, eine andere (hoffentlich) bessere Antwort.

Es könnte möglich sein, dies zu tun, indem Sie die aktuelle Konsole mit FreeConsole freigeben und dann eine neue Konsole mit AllocConsole zuweisen. Ich würde annehmen, dass es den Befehlszeilenverlauf dann nicht behalten würde.

Im Allgemeinen, wenn Sie die Dinge mit der Konsole machen wollen, die von .NET Framework nicht unterstützt wird, ist diese MSDN-Seite ein guter Ort zu suchen: Console Functions

+0

Tut nichts zur Geschichte, fürchte ich. – adrianbanks

+0

@adrianbanks: Yep, war verwirrt über das, was Sie getan haben (obwohl ich zumindest einen anderen Fehler gemacht habe als die anderen Antworten auf diese Frage :)). Ich habe meine Antwort mit einer anderen möglichen Lösung aktualisiert. –

4

Konnte dieser Beitrag auf How can I configure the command line history, DOSKEY? Hilfe?

In alten DOS-Tagen war ein Dienstprogramm verfügbar, DOSKEY.EXE, das es dem Benutzer ermöglichte, vorherige Befehle zu durchlaufen. In NT ist dies standardmäßig aktiviert und Sie können alte Befehle durchgehen, DOSKEY hat jedoch andere Fähigkeiten.

die aktuelle Befehlszeile Geschichte Verwendung Befehl zu löschen:

doskey /reinstall 

Sie können auch optional sagen, wie viele alte Befehle mit dem/LISTSIZE Parameter 50

doskey /reinstall /listsize=50 

halten alte Befehle würde zu halten .

Bitte lassen Sie mich wissen, ob es funktioniert und wie man verwendet :) es

+0

Funktioniert auf XP SP3. – mavnn

+0

Ich möchte dies programmgesteuert in meiner eigenen Konsolenanwendung tun, damit ich nicht auf ein externes Tool angewiesen bin. – adrianbanks

+1

Was ist, wenn die Funktionalität, die Sie unterdrücken möchten, von demselben Tool bereitgestellt wird? –

0

Sie könnten versuchen, mit der Eigenschaft

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

Ich habe das schon versucht, aber es lässt mich keinen Wert von Null setzen. – adrianbanks

+0

BufferHeight ist das scrollbare Fenster aller Konsolenausgaben. Deshalb gibt es auch BufferWidth. –

1

Werfen Sie einen Blick auf SetConsoleHistoryInfo. Laut der Dokumentation funktioniert es nur auf Vista und höher, also bin ich mir nicht sicher, ob es dir hilft oder nicht.

1

Dieser Code funktioniert für mich, um den Befehlsverlauf zu löschen. Begrenzte Tests und keine Garantien für die Portabilität.

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

Fehlerbehandlung entfernt und durch Retouren ersetzt, um die Lesbarkeit des Konzeptbeispiels zu verbessern. –

+0

Dies sollte die richtige Antwort sein. Es ist C# .NET verwalteten Code, der die Win32-Aufrufe umschließt, um zu erreichen, was Sie brauchen. Wrapper-Code wie dieser ist erforderlich, um programmgesteuert die Funktionen der Win32-Konsole zu erreichen, z. B. Umschalten von EOL-Umbruch, Zentrieren der Konsole auf dem Bildschirm, Sperren der Fensteraktualisierung usw. – delrocco