GetAsyncKeyState

M

MrCodeMaster

Hallo Leute, ich hab mal eine Frage an euch :)

Ich hab mir einen kleinen Gold Trainer geschrieben, nun hab ich dass Problem, dass er mir eine while Schleife nicht richtig ausführt und ich keine Ahnung habe warum :(

Code:
while(1)
	{
		int KeyState = 0;
		KeyState = GetAsyncKeyState(VK_INSERT);
		
		if(KeyState != 0)
			{
	
				if(!WriteProcessMemory(hProcessHandle,(LPVOID) adress_1,&value,sizeof(int),NULL))
					{
						cout << "Could not write value to the Memory!\n";
						KeyState = 0;
					}
				else
					{
						cout << "Your value was written to the Memory!\n";
						KeyState = 0;
					}
			}
	}

Hoffentlich könnt ihr mir da helfen :)
 
Ich bekomm nicht nur ein mal die Meldung "Your value was written to the Memory!" sondern viel zu oft

Gruss
MrCodeMaster
 
Die Schleife funktioniert bestens. Für dich sogar zu gut:
Die Zeit, die es braucht, die ganze Schleife durchzugehen ist viel zu kurz. Meist sind das so um die 3ms.
Du drückst die Taste aber länger als 3ms, denn der menschliche Finger ist nicht schnell genug.
Nun kannst du ein
C:
_sleep(100);
ans Ende der Schlaufe schreiben und es wird nur noch einmal kommen.
Oder etwas heikler: GetAsyncKeyState() liefert auch zurück, ob die Taste KEYDOWN oder KEYUP ist.

Gruss
cwriter
 
Das kommt daher, dass GetAsynKeyState() ermittelt, ob die Taste gedrückt ist. Nun drückst du aber die Taste so lange, dass das Programm mehrere - wenn nicht hunderte - Durchläufe der while-Schleife hat.

Die einfachste Lösung wäre es, einen bool-Schalter zu implementieren, z.B.
C++:
bool wasPressed = false;
while(1)
    {
        int KeyState = 0;
        KeyState = GetAsyncKeyState(VK_INSERT);
        
        if(KeyState != 0 && !wasPressed)
            {
               wasPressed = true;
    
                if(!WriteProcessMemory(hProcessHandle,(LPVOID) adress_1,&value,sizeof(int),NULL))
                    {
                        cout << "Could not write value to the Memory!\n";
                        KeyState = 0;
                    }
                else
                    {
                        cout << "Your value was written to the Memory!\n";
                        KeyState = 0;
                    }
            }
            else {
              wasPressed = false;
            }
    }
Andere Möglichkeiten wären, die 'realen' KeyUp-Events seitens der Windows-Nachrichtenschleife abzufangen.


PS: Bei der ersten Method bestünde - rein theoretisch gesehen - die Gefahr, dass manchmal Tastendrücke nicht registriert werden. Aber das wäre wohl sehr unwahrscheinlich.
 
Zudem: Die Prüfung != 0 ist nicht korrekt. GetAsyncKeyState garantiert für das most und least significant bit eine Bedeutung, alle anderen können theoretisch einfach zufällig sein. Ausserdem heisst der Rückgabewert 0:
The return value is zero for the following cases:
The current desktop is not the active desktop
The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.

Willst du prüfen ob die Taste aktuell gedrück ist oder nicht:
C++:
if((keyState & 0x8000) != 0)

Veiel Grüsse
Cromon
 

Neue Beiträge

Zurück