• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++ ]Jak wykryć czy użytkownik nacisnął klawisz (konsola)

Object Storage Arubacloud
0 głosów
3,057 wizyt
pytanie zadane 16 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
Nie żebym nie pamiętał, ale nie pamiętam. Pamiętam, że coś takiego kiedyś miałem, bodajże getchar. Ale teraz gdy używam getchar, to mogę jedynie coś wpisać, nie pamiętam jak się ta funkcja nazywała. Chodzi mi o to, że kiedy użytkownik naciśnie np. ESC, to program to wykryje. Liczę na szybką pomoc.
komentarz 16 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
Kiedy naciśnie? Funkcja będzie czekać na wejście, czy ma się to dziać asynchronicznie?
komentarz 16 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
Asynchronicznie czyli? Chodzi mi o to, że załóżmy mam sobie nieskończoną pętlę i czekam sobie aż użytkownik naciśnie sobie np. ESC. Użytkownik nie może wpisać ESC jako znaku, więc żadne cin'y, getline'y  czy inne nie pomogą. Funkcja ta zapisywała chyba kod ASCII naciśniętego przycisku. W przypadku ESC to chyba 27.
komentarz 16 lutego 2018 przez Kabuuz Bywalec (2,820 p.)
_kbhit()?

1 odpowiedź

+1 głos
odpowiedź 16 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 16 lutego 2018 przez Hiskiel
 
Najlepsza

Funkcja getch z conio.h zwraca kod naciśniętego klawisza bez zatwierdzania go enterem. W połączeniu z funkcją kbhit sprawdzającą, czy naciśnięto jakiś klawisz, możesz zrobić prosty asynchroniczny system zdarzeń z klawiatury.

if (kbhit())
{
	if (getch() == 27)
	{
		// ...
	}
}
komentarz 16 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)

Nie działa :/ (nie, że wczytywanie nie działa [bo nie działa] tylko nie dział ten kbhit it.d.) tutaj pętla:

    while(1){
//        if(!stream.is_open()) {
//                SetConsoleTextAttribute(hl,13-1);
//                cout<<"!Cannot open the file. Completing the program.!";
//                SetConsoleTextAttribute(hl,8-1);
//                Sleep(3000);
//                exit(0);
//        }
        if(kbhit()){
            cout<<"elo";
            //if(getch()==27){SetConsoleTextAttribute(hl,8-1); exit(0);};
        }

        //nextLine="NULL";
        // stream>>nextLine;
        //cout<<nextLine<<endl;
    }

 

komentarz 16 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
Dobra, działa. Teraz tylko program się sypie gdy się włącza :/. Zakładać nowy temat czy pomożesz?
komentarz 16 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
Taki kod nie przejdzie. Musisz dać w środku warunku getch, gdyż inaczej kbhit ciągle będzie zwracało prawdę (bufor klawiatury nigdy nie zostanie oczyszczony).
komentarz 16 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
Dobra, dziękuję za pomoc. Jutro spróbuje coś podebugować.
komentarz 16 lutego 2018 przez Beginer Pasjonat (22,110 p.)

@Patrycjerz,

Czy wiesz może, dlaczego w standardowej bibliotece C++ nie ma getch (ważnej i często używanej funkcji), tylko trzeba dodawać nagłówek conio.h ?

komentarz 16 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
Autorzy biblioteki standardowej oferują jedynie strumienie wejścia zatwierdzane enterem, tak sobie to ktoś zaprojektował i tak to wygląda. W 99% wystarczają one do projektowania aplikacji konsolowych.
komentarz 16 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Rozumiem. Trochę szkoda, że tak jest, bo funkcja getch jest często potrzebna i wykorzystywana (widać choćby z przykładów na forum).

Dziękuję za wyjaśnienie.
komentarz 16 lutego 2018 przez Beginer Pasjonat (22,110 p.)

@Patrycjerz,

Dlaczego pętla while nie chce się wykonywać? Teoretycznie powinna..

(Celowo usunąłem funkcję kbhit()).

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int A = 0;
    while (A == 0)
    {
      
           if (getch() == 27)
           {
             break;
           }

      cout << "Hello world!" << endl;
    }

    return 0;
}

 

komentarz 16 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
Dlaczego niby nie chce się wykonywać? Wg tego kodu program powinien wypisywać napis "Hello world!", jeśli nacisnąłeś klawisz inny niż ESC.
komentarz 16 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Jest tak jak mówisz, pętla rusza dopiero po naciśnięciu jakiegoś klawisza. Ale przecież warunek if nie jest na razie spełniony, więc powinien być pominięty (przeskoczony).
komentarz 16 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)

Ale nie zauważasz jednej podstawowej rzeczy: funkcja getch czeka na naciśnięcie klawisza.

komentarz 16 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Teraz rozumiem, działanie "stopuje" funkcja getch(), która oczekuje wprowadzenia jakiegoś znaku, dopiero w następnej kolejności jest sprawdzany warunek if.

Dlatego potrzebna jest (wcześniejsza) funkcja khbit().

Jeszcze raz dziękuję! Wybacz, że tak późno zawracam głowę.
komentarz 16 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)

Dokładnie. Funkcja kbhit jest po to, aby getch nie zatrzymywało programu.

Ja i tak siedzę do późna. Nie musisz mnie za nic przepraszać wink

Podobne pytania

0 głosów
2 odpowiedzi 1,539 wizyt
0 głosów
1 odpowiedź 812 wizyt
pytanie zadane 13 sierpnia 2018 w C i C++ przez Ogleirduwa Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 578 wizyt
pytanie zadane 6 maja 2017 w C i C++ przez Pajdas Mądrala (5,930 p.)

92,624 zapytań

141,482 odpowiedzi

319,822 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...