Problem z odczytywaniem klawiatury
Ostatnio zmodyfikowano 2019-02-12 10:28
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 #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 ) { if( wybrana_opcja == - 1 ) { wybrana_opcja_1: switch( wybrana_opcja ) { case - 1: { opcja[ 0 ] = "START "; opcja[ 1 ] = "OPCJE "; opcja[ 2 ] = "O AUTORZE "; opcja[ 3 ] = "EXIT "; break; } case 0: { opcja[ 0 ] = "A "; opcja[ 1 ] = "B "; opcja[ 2 ] = "C "; opcja[ 3 ] = "EXIT "; break; } case 1: { opcja[ 0 ] = "GRAFIKA "; opcja[ 1 ] = "DZWIEK "; opcja[ 2 ] = "KLAWISZE "; opcja[ 3 ] = "EXIT "; break; } case 2: { opcja[ 0 ] = "G "; opcja[ 1 ] = "H "; opcja[ 2 ] = "I "; opcja[ 3 ] = "EXIT "; break; } case 3: { return 0; break; } } } system( "cls" ); 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;; } if( true ) { cout << nr_opcji << endl; cout << wybrana_opcja << endl; cout << pomocnicza << endl; cout << glebia << endl; } klawisze: if( GetAsyncKeyState( 87 ) == - 32767 ) nr_opcji--; else if( GetAsyncKeyState( 83 ) == - 32767 ) nr_opcji++; 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; } 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 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; x: if( GetAsyncKeyState( 87 ) == - 32767 ) { numerOpcji--; } else if( GetAsyncKeyState( 83 ) == - 32767 ) { numerOpcji++; } else if( GetAsyncKeyState( VK_RETURN ) == - 32767 ) { if( numerOpcji == 2 ) { goto wyjscie; } } else goto x; goto poczatek; wyjscie:; }
[/i] |
|
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. |
|
« 1 » |