NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Lekce 2 - Analýza dat ze vstupu z klávesnice v C# Konzoli

V minulé lekci, Zadávání vstupu z klávesnice v C# Konzoli, jsme si představili možnosti zajištění datového vstupu z klávesnice pomocí metod a vlastností třídy Console.

V dnešním C# tutoriálu se naučíme efektivně analyzovat informace, které jsou z klávesnice zadávány. Uvidíme, že třída Console umí nejen načítat znaky, které každé klávese přísluší, ale že nám o každé stisknuté klávese dokáže předat více údajů. A tyto údaje pak můžeme snadno využít k ovládání svých aplikací.

Objekt ConsoleKeyInfo

Nejprve si ukážeme, jak v jednom kroku zjistit název stisknuté klávesy a její znak, a poté také kombinaci stisknutých kláves.

Klávesa a znak

Zatím jsme se naučili, jak použít metodu ReadKey() spolu s vlastnostmi Key a KeyChar. Je to jednoduché a funguje to dobře, avšak má to jednu nevýhodu. Získáme pouze malou část informací, které bychom získat mohli - buď jen název stisknuté klávesy, nebo jen znak, který klávesa reprezentuje. Už při zadávání příkazu se tak musíme rozhodnout, jakou informaci potřebujeme.

Existuje možnost načíst pomocí ReadKey() komplexní informace o stisknuté klávese a uložit ji do proměnné typu ConsoleKeyInfo. Poté si z ní můžeme zjistit potřebné informace.

ConsoleKeyInfo je objekt, který podává úplný popis klávesy, která byla stisknuta, a to včetně stavu kláves Shift, Alt a Ctrl.

Na objektu ConsoleKeyInfo můžeme volat tři atributy jako vlastnosti: Key, KeyChar a Modifiers.

Vlastnosti Key a KeyChar jsme si již představili přímo u metody ReadKey(). Tyto vlastnosti nám umožňují získat z klávesnice buď název klávesy, nebo znak, který klávesa reprezentuje. Na objektu ConsoleKeyInfo tyto vlastnosti fungují stejně, ale s tím rozdílem, že použitím objektu ConsoleKeyInfo můžeme zjistit obojí najednou.

V následujícím příkladu nejdříve deklarujeme proměnnou zadani jako typ ConsoleKeyInfo, a pak do ní načteme znak metodou ReadKey(). Potom za použití vlastností KeyChar a Key můžeme zjistit jak zapsaný znak, tak i název stisknuté klávesy:

ConsoleKeyInfo zadani;
Console.Write("Stiskni klávesu");
zadani = Console.ReadKey(true);
Console.WriteLine ("\nZnak = " + zadani.KeyChar);
Console.WriteLine ("Klávesa = " + zadani.Key);

Výstupem bude:

Konzolová aplikace
Stiskni klávesu
Znak = g
Klávesa = G

Kombinace kláves

Objekt ConsoleKeyInfo nabízí ještě třetí vlastnost, a to vlastnost Modifiers, která vrací bitovou kombinaci stisknutých kláves Shift, Alt a Ctrl. Této vlastnosti se pak využívá ve spojení s výčtem ConsoleModifiers k určení, která z funkčních kláves byla stisknuta.

Nerozlišují se levé a pravé klávesy Shift a Ctrl. Klávesa pravá Alt se chová tak, jako by byla stisknuta kombinace kláves levá Alt+Ctrl.

Ukažme si prakticky, jak informace uložené v objektu ConsoleKeyInfo využít pomocí volání vlastností Key, KeyChar a Modifiers: Nejdříve si deklarujme proměnnou zadani typu ConsoleKeyInfo a řetězec vypis typu string pro uložení výsledku:

ConsoleKeyInfo zadani;
string vypis;

V dalším kroku vyzveme uživatele ke stisknutí nějaké kombinace kláves, nebo klávesy Esc pro ukončení. V kódu je použit speciální znak \n pro odřádkování:

Console.WriteLine("Stiskni kombinaci znaku a klávesy SHIFT, ALT a CTRL,\nnebo pro ukončení stiskni ESC");

Následně vytvoříme cyklus, který nám umožní zadávat znaky opakovaně, dokud nebude stisknuta klávesa Esc. Pro podmínku je použita vlastnost Key ve spojení s výčtem ConsoleKey pro kontrolu stisku klávesy Esc:

do
{


} while (zadani.Key != ConsoleKey.Escape);

Další příkazy píšeme dovnitř cyklu. Nejprve stisknutou kombinaci kláves načteme do zadani a použijeme přitom parametr true, aby se znak při zadávání nevypisoval. Do řetězce vypis vložíme začátek výpisu:

zadani = Console.ReadKey(true);
vypis = "Stiskl jsi klávesu:"

Následuje kontrola stisknutí kláves Shift, Alt, nebo Ctrl pomocí porovnání vlastnosti Modifiers s výčtem ConsoleModifiers. Protože informace o stisknutých klávesách je uložena jako bitová kombinace, pro porovnání s výčtem se používá bitový logický operátor AND &. Nalezenou klávesu přidáme do řetězce vypis:

if ((zadani.Modifiers & ConsoleModifiers.Alt) != 0) vypis += "Alt+";
if ((zadani.Modifiers & ConsoleModifiers.Shift) != 0) vypis += "Shift+";
if ((zadani.Modifiers & ConsoleModifiers.Control) != 0) vypis += "Ctrl+";

Poté řetězec vypis zkompletujeme informacemi z vlastností Key a KeyChar a výsledek vypíšeme:

vypis += zadani.Key.ToString();
vypis += "   Znak = " + zadani.KeyChar;
Console.WriteLine(vypis);

Kompletní kód pak vypadá takto:

ConsoleKeyInfo zadani;
string vypis;
Console.WriteLine("Stiskni kombinaci znaku a klávesy SHIFT, ALT a CTRL,\nanebo pro ukončení stiskni ESC");
do
{
   zadani = Console.ReadKey(true);
   vypis = "Stiskl jsi klávesu:";
   if ((zadani.Modifiers & ConsoleModifiers.Alt) != 0) vypis += "ALT+";
   if ((zadani.Modifiers & ConsoleModifiers.Shift) != 0) vypis += "SHIFT+";
   if ((zadani.Modifiers & ConsoleModifiers.Control) != 0) vypis += "CTRL+";
   vypis += zadani.Key.ToString();
   vypis += "   Znak = " + zadani.KeyChar;
   Console.WriteLine(vypis);
} while (zadani.Key != ConsoleKey.Escape);

Výstup:

Konzolová aplikace
Stiskni kombinaci znaku a klávesy SHIFT, ALT a CTRL,
anebo pro ukončení stiskni ESC
Stiskl jsi klávesu L   Znak = l
Stiskl jsi klávesu SHIFT+L   Znak = L
Stiskl jsi klávesu ALT+CTRL+X   Znak = #
Stiskl jsi klávesu Escape   Znak =

Zkusme si ve svém Visual Studiu kód otestovat stisknutím kombinace různých kláves. Např. jakékoliv klávesy nejprve s klávesou levý Alt a poté s klávesou pravý Alt.

Metoda Equals()

Metoda Equals() slouží k porovnání dvou objektů ConsoleKeyInfo. Podle toho, zda jsou objekty stejné, či ne, vrací metoda bool hodnotu true/false. Aby objekty byly uznány stejnými, musí být stejné všechny jejich vlastnosti, tedy Key, KeyChar i Modifiers. To znamená, že třeba kombinace kláves Ctrl+A se nerovná Shift+A.

Syntaxe příkazu je: prvniZnak.Equals(druhyZnak)

V uvedeném příkladu porovnáváme, zda dva zadané znaky jsou stejné:

ConsoleKeyInfo prvniZnak;
ConsoleKeyInfo druhyZnak;
Console.Write("Zadej první znak: ");
prvniZnak = Console.ReadKey();
Console.Write("\nZadej druhý znak: ");
druhyZnak = Console.ReadKey();
if (prvniZnak.Equals(druhyZnak))
    Console.WriteLine("\nZnaky jsou stejné.");
else
    Console.WriteLine("\nZnaky nejsou stejné.");
Console.ReadKey();

Výstup:

Konzolová aplikace
Zadej první znak: t
Zadej druhý znak: T
Znaky nejsou stejné.

Třída Console

Na závěr si ukážeme vlastnosti TreatControlCAsInput, CapsLock a NumberLock na třídě Console .

Vlastnost TreatControlCAsInput

Možná, že už jste při své programátorské práci zjistili, že stisknete-li při běhu své aplikace kombinaci kláves Ctrl+C, běh aplikace se ukončí. To je tím, že právě tato kombinace kláves je standardně operačním systémem považována za přerušení. A právě vlastnost TreatControlCAsInput získává anebo nastavuje bool hodnotu, která určuje, zda je kombinace kláves Ctrl+C aktivní jako přerušení - v tom případě nabývá hodnoty false. Nastavíme-li vlastnost na hodnotu true, bude kombinace kláves Ctrl+C považována za běžný vstup.

Syntaxe:

Console.TreatControlCAsInput = false; // Nastavení, že stisk kombinace CTRL+C způsobí přerušení běhu programu.
Console.TreatControlCAsInput = true; // Nastavení, že stisk kombinace CTRL+C vypíše odpovídající znak.
bool ctrlC = Console.TreatControlCAsInput; // Do proměnné ctrlC se načte aktuální nastavení.

Vlastnost CapsLock

Tato vlastnost vrací bool hodnotu true, je-li CapsLock zapnutý a false, je-li vypnutý:

bool capsLock = Console.CapsLock;
Console.WriteLine($"Klávesa CapsLock je zapnutá: {capsLock}");

Vlastnost NumberLock

Tato vlastnost vrací bool hodnotu true, je-li NumLock zapnutý a false, je-li vypnutý:

bool numberLock = Console.NumberLock;
Console.WriteLine($"Klávesa NumberLock je zapnutá: {numberLock}");

V další lekci, Zvukový výstup v C# Konzoli, se seznámíme s možnostmi, jak ovládat zvukový výstup u konzolových aplikací a jak snadno spočítat frekvence tónů.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 7x (440.9 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
Zadávání vstupu z klávesnice v C# Konzoli
Všechny články v sekci
Konzole C# .NET a její možnosti
Přeskočit článek
(nedoporučujeme)
Zvukový výstup v C# Konzoli
Článek pro vás napsal Luděk Novotný
Avatar
Uživatelské hodnocení:
11 hlasů
Autor je technik, má rád stručné a jasné texty, a tak se také snaží psát články pro vás.
Aktivity