C++ pauza programu na naciśnięcie strzałek

0

Witam,
posiadam prodgram:

#include <windows.h>
#include <iostream> 
 
using namespace std; 
int main()
{
    	int pause1,pause2,wylosowana;
	    bool sprawdz = false;
	    bool pauza = true;  
	    pause1=500;
        pause2=1000;
	        while(1)
    {
   
       	if(GetAsyncKeyState(VK_CONTROL) && sprawdz == true) sprawdz = false; 
        if(GetAsyncKeyState(VK_SHIFT) && sprawdz == false) sprawdz = true;
        if(sprawdz == true) 
        { 
        cout << "start\n\n"; 
        Sleep(500);

    
        keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_LEFT, 0x25, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_LEFT, 0x25, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_LEFT, 0x25, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_LEFT, 0x25, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        wylosowana=rand()%(pause2-pause1+1)+pause1;
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

//lewo 4x
        keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
 wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);

        keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
wylosowana=rand()%(pause2-pause1+1)+pause1;
        cout <<"czas naciśnięcia klawisza " <<wylosowana << "\n";
        Sleep(wylosowana);
//gore 7x
    
}
}
}

 

Jak zrobić by mi program płazował gdy nacisnę ctrl i ruszał gdy nacisnę shift? tak by nie zgubił wątku naciskania klawiszy.

P.S. tak wiem że można to skrócić na pętle ale chce by mi pauzował zaraz po naciśnięciu klawisza więc rozbiłem to i niech już tak zostanie.

Błagam o pomoc to pewnie nic skomplikowanego a potrzebuje szybko rozwiązanie.

Z góry dziękuję i liczę że wysłuchacie mojego błagania.
Pozdrawiam.

0

to jak odpisze ktoś? wiem że to nie jest problem ale nie mogę do tego dojść.

0

Podziel te kbeventy i pobieranie klawiszy z klawiatury na dwa wątki. W jednym pobierasz klawisze i jak wykryjesz ctrl to ustawiasz jakąś flagę, drugi wątek tą flagę sprawdza i jak jest ustawiona to czeka, aż zostanie "odstawiona" przez shift.

0

P.S. tak wiem że można to skrócić na pętle ale chce by mi pauzował zaraz po naciśnięciu klawisza więc rozbiłem to i niech już tak zostanie.

Nie znam się w ogóle na przechwytywaniu klawiatury ale nie chce mi się wierzyć że trzeba tak rozwijać pętlę by móc zpauzować program zaraz po naciśnięciu klawisza.

0
stryku napisał(a):

Podziel te kbeventy i pobieranie klawiszy z klawiatury na dwa wątki. W jednym pobierasz klawisze i jak wykryjesz ctrl to ustawiasz jakąś flagę, drugi wątek tą flagę sprawdza i jak jest ustawiona to czeka, aż zostanie "odstawiona" przez shift.

gdybym to zrozumiał było by fajnie ;/ noga ze mnie jeśli o programowanie chodzi.

0

To się poducz zanim zabierzesz się za pisanie botów (:

0

Problem jest w tym że GetAsyncKeyState() dotyczy naciśnięć klawiszy tylko wtedy kiedy twoja aplikacja jest aktywna.
Podejrzewam że te left/up chcesz "naciskać" w innym okienku, więc GetAsyncKeyState() zwyczajnie nie będzie zwracać tego czego oczekujesz.
Jest tylko dwa sensowne sposoby: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
oraz Journal Hook - to jeszcze bardziej skomplikowane.
Ale skoro jeszcze nie opanowałeś zwyczajnej pętli to zapomnij o tym - na razie nie dasz rady.

0
_13th_Dragon napisał(a):

Problem jest w tym że GetAsyncKeyState() dotyczy naciśnięć klawiszy tylko wtedy kiedy twoja aplikacja jest aktywna.
Podejrzewam że te left/up chcesz "naciskać" w innym okienku, więc GetAsyncKeyState() zwyczajnie nie będzie zwracać tego czego oczekujesz.
Jest tylko dwa sensowne sposoby: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
oraz Journal Hook - to jeszcze bardziej skomplikowane.
Ale skoro jeszcze nie opanowałeś zwyczajnej pętli to zapomnij o tym - na razie nie dasz rady.

opanowałem wszystkie pętle i nie chce robić tego w innym okienku... tylko właśnie w aktywnym chodzi mi o coś takiego by wstawić pomiędzy naciskanie klawiszy:

if( sprawdzć czy klawisz jest wciśnięty) { jak jest system(pause) i tu jak wcisne ponownie rusza}

ale jak to ogarnąć kiedyś miałem to ale już nie pamiętam jak to szło.... wiem że to banalnie proste jest.

0
noskiri napisał(a):

... opanowałem wszystkie pętle ...
I dla używasz metodę Kopiego Pejsta na 4 razy w lewo i 7 razy do góry zamiast w sumie jednej pętli?

noskiri napisał(a):

... nie chce robić tego w innym okienku... tylko właśnie w aktywnym ...
Może poczytaj dokumentacje na temat GetAsyncKeyState() czy to też opanowałeś jak pętli?

1 użytkowników online, w tym zalogowanych: 0, gości: 1