Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z odczytywaniem klawiatury

Ostatnio zmodyfikowano 2019-02-12 10:28
Autor Wiadomość
Xames
Temat założony przez niniejszego użytkownika
Problem z odczytywaniem klawiatury
» 2019-02-12 09:42:47
Witam, ostatnio piszę sobie program jako zadanie dodatkowe do szkoły. Problem jest w tym. że gdy wejdę w ustawienia (po uruchomieniu programu) a następnie w którąś z opcji to zamiast poruszać się normalnie W i S to muszę kliknąć WD i SA bo inaczej nic się nie dzieje.

main. cpp
C/C++
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include "funk.h"

using namespace std;

string opcja[ 4 ];
int nr_opcji, wybrana_opcja = - 1, pomocnicza, glebia = 1;

int main()
{
    while( true )
    {
        //Obsluga opcji dla menu start
        if( wybrana_opcja == - 1 )
        {
            wybrana_opcja_1:
            switch( wybrana_opcja )
            {
                //Menu glowne
            case - 1:
                {
                    opcja[ 0 ] = "START        ";
                    opcja[ 1 ] = "OPCJE        ";
                    opcja[ 2 ] = "O AUTORZE    ";
                    opcja[ 3 ] = "EXIT         ";
                    break;
                }
                //Start
            case 0:
                {
                    opcja[ 0 ] = "A            ";
                    opcja[ 1 ] = "B            ";
                    opcja[ 2 ] = "C            ";
                    opcja[ 3 ] = "EXIT         ";
                    break;
                }
                //Opcje
            case 1:
                {
                    opcja[ 0 ] = "GRAFIKA      ";
                    opcja[ 1 ] = "DZWIEK       ";
                    opcja[ 2 ] = "KLAWISZE     ";
                    opcja[ 3 ] = "EXIT         ";
                    break;
                }
                //O autorze
            case 2:
                {
                    opcja[ 0 ] = "G            ";
                    opcja[ 1 ] = "H            ";
                    opcja[ 2 ] = "I            ";
                    opcja[ 3 ] = "EXIT         ";
                    break;
                }
                //Wyjscie
            case 3:
                {
                    return 0;
                    break;
                }
            }
        }
        system( "cls" );
        //Ustawienie strzalki
        for( int i = 0; i < 4; i++ )
        {
            opcja[ i ][ 11 ] = ' ';
            opcja[ i ][ 12 ] = ' ';
            if( i == nr_opcji )
            {
                opcja[ i ][ 11 ] = '<';
                opcja[ i ][ 12 ] = '-';
            }
            cout << opcja[ i ] << endl;;
        }
        //Wyswietlanie zmiennych
        if( true )
        {
            cout << nr_opcji << endl;
            cout << wybrana_opcja << endl;
            cout << pomocnicza << endl;
            cout << glebia << endl;
        }
        //Obsluga klawiatury
        klawisze:
        if( GetAsyncKeyState( 87 ) == - 32767 )
             nr_opcji--;
        else if( GetAsyncKeyState( 83 ) == - 32767 )
             nr_opcji++;
        //Obsluga Enter
        else if( GetAsyncKeyState( VK_RETURN ) == - 32767 )
        {
            if( wybrana_opcja == - 1 )
            {
                wybrana_opcja = nr_opcji;
                pomocnicza = nr_opcji;
                nr_opcji = 0;
                glebia++;
                goto wybrana_opcja_1;
            }
            //Wyjscie dla kazdej opcji
            else if( wybrana_opcja != - 1 && nr_opcji == 3 )
            {
                glebia--;
                wybrana_opcja = wybrana_opcja - pomocnicza - 1;
                nr_opcji = 0;
            }
           
            else if( wybrana_opcja == 0 && glebia == 2 )
            {
               
            }
           
            else if( wybrana_opcja == 1 && glebia == 2 )
            {
                ustawienia( nr_opcji );
            }
           
            else if( wybrana_opcja == 2 && glebia == 2 )
            {
               
            }
        }
        else
             goto klawisze;
       
        nr_opcji = pozycja_strzalki( nr_opcji, 3 );
    }
    return 0;
}

funk.h
C/C++
using namespace std;

int pozycja_strzalki( int nr_opcji, int iloscOpcji )
{
    if( nr_opcji > iloscOpcji ) return 0;
    else if( nr_opcji < 0 ) return iloscOpcji;
    else return nr_opcji;
   
}
void ustawienia( int Opcja )
{
   
    HANDLE h0ut;
    int numerOpcji = 0, para[ 2 ];
    string text[ 3 ];
    poczatek:
    numerOpcji = pozycja_strzalki( numerOpcji, 2 );
    switch( Opcja )
    {
    case 0:
        {
            para[ 0 ] = 0;
            para[ 1 ] = 1;
            text[ 0 ] = "CZCIONKA     ";
            text[ 1 ] = "TLO          ";
            text[ 2 ] = "EXIT         ";
            system( "cls" );
            for( int i = 0; i < 3; i++ )
            {
                text[ i ][ 11 ] = ' ';
                text[ i ][ 12 ] = ' ';
                if( i == numerOpcji )
                {
                    text[ i ][ 11 ] = '<';
                    text[ i ][ 12 ] = '-';
                }
                if( i < 2 ) cout << text[ i ] << "    " << para[ i ] << endl;
                else cout << text[ i ] << endl;
               
            }
            break;
        }
    case 1:
        {
            para[ 0 ] = 0;
            para[ 1 ] = 1;
            text[ 0 ] = "GLOSNOSC     ";
            text[ 1 ] = "RODZAJ       ";
            text[ 2 ] = "EXIT         ";
            system( "cls" );
            for( int i = 0; i < 3; i++ )
            {
                text[ i ][ 11 ] = ' ';
                text[ i ][ 12 ] = ' ';
                if( i == numerOpcji )
                {
                    text[ i ][ 11 ] = '<';
                    text[ i ][ 12 ] = '-';
                }
                if( i < 2 ) cout << text[ i ] << "    " << para[ i ] << endl;
                else cout << text[ i ] << endl;
               
            }
            break;
        }
    case 2:
        {
            para[ 0 ] = 0;
            para[ 1 ] = 1;
            text[ 0 ] = "GORA DOL     ";
            text[ 1 ] = "WYBRANIE     ";
            text[ 2 ] = "EXIT         ";
            system( "cls" );
            for( int i = 0; i < 3; i++ )
            {
                text[ i ][ 11 ] = ' ';
                text[ i ][ 12 ] = ' ';
                if( i == numerOpcji )
                {
                    text[ i ][ 11 ] = '<';
                    text[ i ][ 12 ] = '-';
                }
                if( i < 2 ) cout << text[ i ] << "    " << para[ i ] << endl;
                else cout << text[ i ] << endl;
               
            }
            break;
        }
    }
    cout << numerOpcji;
    //Obsluga klawiatury
    x:
    if( GetAsyncKeyState( 87 ) == - 32767 )
    {
        numerOpcji--;
    }
    else if( GetAsyncKeyState( 83 ) == - 32767 )
    {
        numerOpcji++;
    }
    //Obsluga Enter
    else if( GetAsyncKeyState( VK_RETURN ) == - 32767 )
    {
        if( numerOpcji == 2 )
        {
            goto wyjscie;
        }
    }
    else goto x;
   
    goto poczatek;
    wyjscie:;
}
[/i]
P-173934
killjoy
» 2019-02-12 10:28:17
Cytując klasyka, dziwne u mnie działa. Dlatego powinno się czytać dokumentację do końca:



(...) if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

I dalej w uwagach czytamy:


Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application.

Źródło:
https://docs.microsoft.com​/en-us/windows/desktop/api​/winuser​/nf-winuser-getasynckeystate

Czyli w skrócie, musisz sprawdzić, czy przycisk jest wciśnięty np. w ten sposób
if( GetAsyncKeyState( 87 ) & 0x8000 ){...}
 i samodzielnie zaimplementować , sprawdzanie, czy klawisz był wciśnięty tylko raz, aby uniknąć skakania po menu, gdy klawisz jest przytrzymany.
P-173937
« 1 »
  Strona 1 z 1