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ę.