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

[C++] Wykrycie myszki i klawiatury jednocześnie. Kilka pytań

Object Storage Arubacloud
0 głosów
617 wizyt
pytanie zadane 16 kwietnia 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)

Witam,

Chciałbym zapytać w jaki sposób mógłbym wykryć w dowolnym momencie trwania programu czy użytkownik użył myszy czy też klawiatury. 

Napisałem coś takiego:

#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <fstream>

#define KEY_UP 72
#define KEY_DOWN 80

using namespace std;





int main() {

od_poczatku:

	ShowWindow(GetConsoleWindow(), SW_MAXIMIZE);
	int Xmouse {};
	int Ymouse {};


	HANDLE hout= GetStdHandle(STD_OUTPUT_HANDLE);
	HANDLE hin = GetStdHandle(STD_INPUT_HANDLE);
	INPUT_RECORD InputRecord;
	DWORD Events;
	COORD coord;
	CONSOLE_CURSOR_INFO cci;
	cci.dwSize = 25;
	cci.bVisible = FALSE;
	SetConsoleCursorInfo(hout, &cci);
	SetConsoleMode(hin, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
	int buttonX=1, buttonY=1;


	//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	HANDLE myconsole = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD wybor_pos;
	
	wybor_pos.X = 78;
	wybor_pos.Y = 21;SetConsoleCursorPosition(myconsole, wybor_pos);std::cout << "1";
	wybor_pos.Y = 23;SetConsoleCursorPosition(myconsole, wybor_pos);std::cout << "2";
	wybor_pos.Y = 25;SetConsoleCursorPosition(myconsole, wybor_pos);std::cout << "3";
	
	wybor_pos.X = 76;
	wybor_pos.Y = 21;
	SetConsoleCursorPosition(myconsole, wybor_pos);
	SetConsoleTextAttribute(myconsole, 14);
	std::cout << "*";
	
	
	

	

	int ctrl {};

	int menu_cho = 1;



	while(1) {

		ReadConsoleInput(hin, &InputRecord, 1, &Events);


		switch ( InputRecord.EventType ) {
			case KEY_EVENT: { // keyboard input
				while(ctrl = getch()) {


					if(ctrl == KEY_UP) {
						if(wybor_pos.Y == 25) {

							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << " ";

							wybor_pos.Y -= 2;
							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << "*";

							menu_cho = 2;
						} else if(wybor_pos.Y == 23) {

							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << " ";

							wybor_pos.Y -= 2;
							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << "*";

							menu_cho = 1;
						}

					} else if(ctrl == KEY_DOWN) {

						if(wybor_pos.Y == 21) {

							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << " ";
							SetConsoleCursorPosition(myconsole, wybor_pos);

							wybor_pos.Y += 2;
							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << "*";

							menu_cho = 2;
						} else if(wybor_pos.Y == 23) {

							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << " ";
							SetConsoleCursorPosition(myconsole, wybor_pos);

							wybor_pos.Y += 2;
							SetConsoleCursorPosition(myconsole, wybor_pos);
							std::cout << "*";

							menu_cho = 3;
						}

					} else if(ctrl == 13) goto dalej;
					else if(ctrl == 27) {
						wybor_pos.X = 0;
						wybor_pos.Y = 56;
						SetConsoleCursorPosition(myconsole, wybor_pos);

						SetConsoleTextAttribute(myconsole, 15);
						system("CLS");
						exit(0);
					}
				}

			}//switch

			//---------------------------------------------------------------------------------

			case MOUSE_EVENT: // mouse input

				if(InputRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) {
					coord.X = InputRecord.Event.MouseEvent.dwMousePosition.X;
					coord.Y = InputRecord.Event.MouseEvent.dwMousePosition.Y;
					SetConsoleCursorPosition(hout,coord);



					Xmouse = InputRecord.Event.MouseEvent.dwMousePosition.X;
					Ymouse = InputRecord.Event.MouseEvent.dwMousePosition.Y;

						 if(Ymouse == 21) menu_cho = 1;
					else if(Ymouse == 23) menu_cho = 2;
					else if(Ymouse == 25) menu_cho = 3;

					goto dalej;
				}



//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


		}
	}
dalej:
	switch(menu_cho) {
		case 1: {
			system("CLS");
			std::cout << "Wybrano opcje nr 1\n\n\n";
			system("pause");
			break;
		}
		case 2:
		{
			
			system("CLS");
			std::cout << "Wybrano opcje nr 2\n\n\n";
			system("pause");
			break;
		}

		case 3: {

			system("CLS");
			std::cout << "Wybrano opcje nr 3\n\n\n";
			system("pause");
			break;
		}


	}

	system("cls");
	goto od_poczatku;
	
}

Za pierwszym razem muszę pobrać "wybór" czy to będzie klawisz czy przycisk myszki od użytkownika.

Po wybraniu jakiejś opcji (enter) i wróceniu do opcji wyboru już mogę sterować tylko klawiszami (chodzi o klawisze ze strzałkami). Przyciski myszy są już ignorowane. 

Pytanko moje brzmi: co mógłbym zrobić, ażeby:

1) Na początku nie wczytywało mi "dwa razy" wyboru -> chodzi o to, że abym mógł wybrać opcję 2 za pomocą strzałek to muszę kliknąć 2 razy strzałkę w dół (tylko na początku się tak dzieje)

2) Aby mouse click był wykrywany również po ponownym wczytaniu opcji

3) Co mógłbym zrobić, aby np. raz "zejść" na opcję niżej (np na opcję 2) nie zatwierdzać jej enterem, i myszką wybrać np inną opcję lub taką samą?

 

Tak naprawdę nigdy wcześniej nie korzystałem z opcji przycisków myszy i to co jest zawarte w kodzie i dotyczy wykrywania myszki to zmodyfikowany pierwszy lepszy program z internetu do najkrótszej postaci (Sam nie wiem za bardzo co do czego służy), arrow keys detecting to już moja własna praca i z tym nie mam za bardzo problemów.

Bardzo prosiłbym o pomoc (uczę się programowania od niedawna (pół roku) i po prostu chciałbym rozszerzyć swoje horyzonty).

Z góry dziękuję.

komentarz 16 kwietnia 2019 przez niezalogowany
Mogę się podpiąć pod pytanie bo mi myszka w ogóle nie działa ani z twojego kodu ani stąd

https://docs.microsoft.com/en-us/windows/console/reading-input-buffer-events.

Co zrobiłeś aby działała?
komentarz 16 kwietnia 2019 przez Teslum_369 Gaduła (4,190 p.)
Spróbuj kliknąć "wprost" na liczbę
komentarz 16 kwietnia 2019 przez niezalogowany
próbowałem obklikałem wszytko co na żółto

ale ten kod micosoftu  wkleiłem  i myszka też nie działa
komentarz 17 kwietnia 2019 przez niezalogowany

Na moje problemy pomogło to teraz mam to co u Ciebie

https://stackoverflow.com/questions/42213161/console-mouse-input-not-working


....................
void MyErrorExit(char *s)
{
    printf("Fatal: %s\n", s);
    exit(1);
}
......................................

int main() {
...........................
    if (! SetConsoleMode(hin, ENABLE_EXTENDED_FLAGS) )
           MyErrorExit("SetConsoleMode");
    SetConsoleMode(hin, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
.........................

 

komentarz 18 kwietnia 2019 przez niezalogowany
edycja 19 kwietnia 2019

@Teslum_369,  Jak byś znalazł rozwiązanie daj znać szczególnie z ta myszką to był bym bardzo wdzięczny.

Przerobiłem to z Microsoftu i do puki nie wyświetlę menu (dokładnie tak jak u Ciebie) działa mi myszka i klawisze, oraz jak nie wyczyszczę ekranu

"dwa razy" wyboru ->  myślę ze temu jest winny getch(), ale dlaczego nie za każdym razem to też jest dla minie zagadka. Zastosowałem: https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes i zejścia niema.

 case KEY_EVENT:
                    KeyEventProc(irInBuf[i].Event.KeyEvent);
                    break;
VOID KeyEventProc(KEY_EVENT_RECORD ker)
{
   ///l printf("Key event: ");
    if(ker.bKeyDown)
    {
       if((ker.wVirtualKeyCode)==VK_UP)up();
        else if((ker.wVirtualKeyCode)==VK_DOWN)down();
        else if((ker.wVirtualKeyCode)==VK_ESCAPE)ucieczka();
        else if((ker.wVirtualKeyCode)==VK_RETURN)enter();
       ///   printf("key pressed\n");
   }
  //  else

 ///      printf("key released\n");
}
VOID up()
{
                            SetConsoleCursorPosition(myconsole, wybor_pos);
                            printf(" ");

                            wybor_pos.Y -= 2;
                            if(wybor_pos.Y < 21) wybor_pos.Y =27;

                            SetConsoleCursorPosition(myconsole, wybor_pos);
                            printf("*");
                            FlushConsoleInputBuffer(myconsole);
                          ///  menu_cho = 1;
}

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 2,421 wizyt
pytanie zadane 24 września 2020 w Systemy operacyjne, programy przez zkkf56 Dyskutant (8,710 p.)
0 głosów
2 odpowiedzi 473 wizyt
+1 głos
0 odpowiedzi 426 wizyt
pytanie zadane 9 kwietnia 2021 w C i C++ przez Kochany 1337 Użytkownik (860 p.)

92,566 zapytań

141,420 odpowiedzi

319,614 komentarzy

61,952 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!

...