Jason. Cała informatyka w jednym miejscu!

Kontynuujemy eksplorację klasy "Console" w "CSharpie". Usiądziemy i popatrzymy sobie teraz na taki cosik jakim jest "ConsoleKeyInfo" w języku C#. Ten twór może przydać się tym programom konsolowym, które wymagają dokładniejszej analizy wciskanych klawiszy. Struktura obsługuje nawet wykrywanie kombinacji klawiszy :O!

"CONSOLEKEYINFO" W JĘZYKU C# TO STRUKTURA, KTÓRA POWIE CI WIĘCEJ O WCIŚNIĘTYCH KLAWISZACH!

Nie zastanawiało Was nigdy jak możecie zaprogramować wykrycie kombinacji "Shift+A" albo każdej innej? Bawienie się w pętle "for" i sprawdzanie stanów każdego przycisku z osobna wydaje się być prymitywne dla języka C#, ale na szczęście przychodzi nam z pomocą struktura o nazwie "ConsoleKeyInfo" :)!

WŁAŚCIWOŚCI STRUKTURY "CONSOLEKEYINFO"

"ConsoleKeyInfo" przechowuje zaledwie trzy właściwości, ale za to jakie pożyteczne! Przydają się w sprawach ustalenia które klawisze zostały w tym samym czasie naciśnięte. Może na początek przedstawię te trzy właściwości:

NAZWA ZNACZENIE
Key Wartość typu wyliczeniowego "ConsoleKey"*
KeyChar Kod odczytanego znaku w standardzie "Unicode"
Modifiers Określenie które klawisze specjalne (Ctrl, Alt, Shift) zostały naciśnięte

* - wartość nie jest zwracana w postaci żywego typu "char", tylko jako jeden z kluczy "ConsoleKey", który sam w sobie jest typem wyliczeniowym np. przykładową wartością może być "ConsoleKey.Q" po wciśnięciu klawisza Q

Widzicie? Trzecia właściwość o nazwie "Modifiers" - to ona pozwala na wykrywanie kombinacji wciśniętych klawiszy. To jest to, czym chcę przykuć Waszą uwagę w materiale o "ConsoleKeyInfo" w języku C# ;).

PRZYKŁAD KODU ŹRÓDŁOWEGO

Zakończmy ten krótki wątek, bo to tylko pogadanki o strukturze. Po wstępnym zaprogramowaniu sobie odbierania sygnałów z klawiatury, dodajemy sobie pętlę "do while", aby trzymała użytkownika w ryzach, do momentu wciśnięcia następnym razem kombinacji klawiszy Ctrl+C, która domyślnie jest kombinacją wysyłającą sygnał przerwania do procesu. Z tego względu przyda się też ustawienie właściwości "TreatControlCAsInput" klasy "Console" na "prawdę". Popatrzmy na całokształt:

ConsoleKeyInfo cki;

Console.TreatControlCAsInput = true;

do
{
	cki = Console.ReadKey(true);
		
	if((cki.Modifiers & ConsoleModifiers.Control) != 0)
	{
		Console.Write("CTRL ");
	}
	else if((cki.Modifiers & ConsoleModifiers.Shift) != 0)
	{
		Console.Write("SHIFT ");
	}
	else if((cki.Modifiers & ConsoleModifiers.Alt) != 0)
	{
		Console.Write("ALT ");
	}
	
	Console.WriteLine(cki.Key);
}
while (cki.Key != ConsoleKey.C || (cki.Modifiers & ConsoleModifiers.Control) == 0);

Prosta sprawa. Wyświetlanie wciśniętego klawisza wraz z wypisywaniem które zostały wciśnięte odpowiedzialne za "produkcję" kombinacji ("CTRL", "ALT" i "SHIFT"). Wszystko dzięki wykorzystaniu struktury "ConsoleKeyInfo" w języku C#. Pętla kończy się, gdy użytkownik wciśnie popularną kombinację Ctrl+C. Gdybyśmy nie ustawili właściwości "TreatControlCAsInput" na "true", wtedy dalej by to było interpretowane jako wysłanie sygnału do procesu. A tak, wszystko przebiega prawidłowo.

Natomiast żeby zaprogramować wykrywanie który z klawiszy wciśnięto, nie zrobimy tego w sposób tradycyjny (wartość typu "bool" albo metoda zwracająca "booleana"). Musimy zastosować iloczyn bitowy! Iloczyn bitowy to operacja wyznaczająca liczbę całkowitą będącą wynikiem koniunkcji bitów (oraz konwersji liczby binarnej na dziesiętną). W naszym przypadku chcemy ustalić jak wygląda sprawa z klawiszem "Ctrl" czyli "Control", zatem po prawej stronie umieszczamy operand w postaci "ConsoleModifiers.Control". Lewa strona zaś zawsze jest taka sama - to jest ta właściwość, na którą zwróciłem Waszą uwagę, "Modifiers". Ponieważ "do while" sprawdza warunek odwrotnie do "while", porównujemy koniunkcję bitową do zera. Innymi słowy, zostanie ona przerwana, jeżeli iloczyn bitowy będzie różny od zera (wciśnięto klawisz "Ctrl").

Struktura "ConsoleKeyInfo" w języku C#

Struktura "ConsoleKeyInfo" w języku C# służy do wykrywania wciśniętych klawiszy. Jest w stanie także wykryć kombinacje wciśniętych klawiszy, takich jak "Ctrl+C".


Moi drodzy, to tyle na temat "ConsoleKeyInfo". Temat bardziej poboczny niż wymagany do opanowania (taki "ananas" programistyczny :)), jednak postanowiłem o nim napisać, bo na taki natrafiłem w literaturze.

PODOBNE ARTYKUŁY