c # - Hvorfor har min konsolprogram kommandobeskrivelse?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har skrevet en konsol ansøgning, som i det væsentlige er en Console.ReadLine () - Loop. Når applikationen venter på input, genoptages det ved at trykke på pil op, gennem alle tidligere indtastningslinjer. Min ansøgning indeholder ingen kode for denne funktion. Hvilken del af Windows giver dette? Hvordan kan jeg deaktivere det?


Jeg kan kun se, at det er enten et træk ved konsol-delsystemet eller implementeret i Console.ReadLine ().


Her er nogle eksempler kode, der udviser den beskrevne adfærd:


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


Jeg vil gerne deaktivere historikfunktionen for nu, og genindføre det senere ved hjælp af min egen kode. Den nuværende adfærd er for begrænset.

Bedste reference


Du kan ændre denne funktionsmåde i Windows programmatisk ved at kalde SetConsoleHistoryInfo med en korrekt opsætning CONSOLE\_HISTORY\_INFO struktur ... Der synes at være ingen administreret klasse/metode, så du bliver nødt til at bruge DllImport osv.



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
[10] [11]


Hvis det er nødvendigt - flere andre aspekter af konsollen kan håndteres på en styret måde - se c # konsol, Console.Clear problem

Andre referencer 1


Historikfunktionen er indbygget i Windows Command Shell, det er ikke en funktion af din ansøgning. AFAIK der er ingen måde at deaktivere dette i din kode som det er specifikt for Windows Shell Environment (medmindre der er en indstilling der kan ændres, hvilket sandsynligvis er)


Du kan muligvis tilsidesætte standardadfærden ved at bruge en nøglerlytter til at få alle pil op på tastaturet og udføre din egen kode, så hændelsen ikke falder ned til skallen, der skal håndteres.

Andre referencer 2


Ja, dette er en funktion af konsol-delsystemet, ikke din ansøgning. For at ændre det skal du klikke på konsolets kontrolboks (øverst til venstre), egenskaber, fanebladet Alternativer: 'Kommandog History.' Standarden er 50 elementer, 4 buffere. Det kan angiveligt konfigureres med DOSKEY fra kommandolinjen, men en få minutter tinkering led mig ikke hvor som helst.


ALT+F7 vil rydde kommandoprogrammet, som vil udføre kommandoen DOSKEY /reinstall. Jeg testede i Windows 7.


Opdatering: Det tilsvarende Win32 API-opkald er SetConsoleHistoryInfo og p/invoke signaturen findes på http://pinvoke.net/default.aspx/kernel32/SetConsoleHistoryInfo.html[13]

Andre referencer 3


Ikke testet, men det ser ud til at passere en forekomst af CONSOLE\_HISTORY\_INFO til SetConsoleHistoryInfo med bufferstørrelse og tæller indstillet til 1 ville give samme kontrol som konsolvinduets egenskabsdialog. [14] [15]


P/Invoke definitioner på pinvoke.net [16]


Bemærk også, at dette kræver Windows V6 eller senere (dvs. Vista/2008/7/2008R2).