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:
{CSHARP_CONSOLE} 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); {/CSHARP_CONSOLE}
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é:
{CSHARP_CONSOLE} 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(); {/CSHARP_CONSOLE}
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#