C++ Problem

06/13/2011 20:09 MungoMango#1
Hallo zusammen,

Ich möchte in C++ einen Befehl schreiben der wenn der Benutzer Numpad0 drückt, etwas ausgeführt wird. Wie heisst der Befehl dafür? Und braucht man dafür noch welche Include´s?
06/13/2011 20:17 xAlbStaR™#2
Normaler weise hat das eher nix mit Metin2 zu tun.
Es soll z.B. ein Bot für Metin2 werden aber sowas gehört glaube ich eher in die Coder Section
06/13/2011 20:19 MungoMango#3
Nein es soll ein Hack werden, bitte um Antwort.
06/13/2011 20:29 banjo1#4
*moved
in der M2 Sektion kenne sich doch die wenigsten damit aus.
06/13/2011 20:32 MungoMango#5
Ok danke :)
06/13/2011 20:48 banjo1#6
Kannst dir ja mal das durchlesen: [Only registered and activated users can see links. Click Here To Register...]
06/13/2011 20:49 Unbekannt~#7
Kannst du überhaupt C++
06/13/2011 20:53 xNopex#8
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
06/13/2011 21:01 MungoMango#9
Kann mir jemand ein Beispiel geben? z.B. der code für ein Programm: Wenn Numpad0 gedrückt wird, beendet sich das Programm.
06/13/2011 21:36 xNopex#10
:-/

Code:
    while(true)
    {
        Sleep(250);
        short keyState = GetAsyncKeyState(VK_NUMPAD0);
        if((keyState & 1) == 1)
            std::cout << "Numpad0 wurde gedrueckt";
            
    }
06/14/2011 13:55 .BritainAndy#11
Irgendwie verstehe ich nicht folgenden Abschnitt, also ich verstehe ihn schon, nur nicht wieso das so angewandt wird.

Code:
if((keyState & 1) == 1)
Wenn die taste gedrückt worden ist, wird ja 1 wiedergegeben.
Deswegen hätte ich folgendes gemacht:

Code:
if(keyState == 1)
, das funktioniert soweit aber nicht.
Würdest du mir eklären wieso du
Code:
if((keyState & 1) == 1)
geschrieben hast?

Lg
06/14/2011 14:31 xNopex#12
Quote:
Wenn die taste gedrückt worden ist, wird ja 1 wiedergegeben.
Nö.
Siehe MSDN:
Quote:
If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState.
Da man keinen direkten Zugirff auf einzelne Bits hat, sondern immer nur auf eine bestimmte Anzahl gleichzeitig (vgl. Byte, Word, DWord, QWord), bedient man sich der Bit-Operatoren, um zu prüfen, welche Bits gesetzt sind und welche nicht.
Bit-Operatoren Siehe: [Only registered and activated users can see links. Click Here To Register...]

Nun ist das ganze auch kein Geheimnis mehr. Will man prüfen, ob das niedrigste Bit gesetzt ist, also das Bit an der Stelle 0, nimmt man den AND-Operator:

Code:
Wenn niedrigstes Bit gesetzt:
11001001 00010001 //Rückgabewert von GetAsyncKeyState [sizeof(short) = 16bit]
00000000 00000001 // (2^0)= 1 in dualer Schreibweise
-------------------
00000000 00000001 //Ergebnis nach der AND-Operation (=1)

Wenn niedrigstes Bit nicht gesetzt:
11001001 00010000 //Rückgabewert von GetAsyncKeyState
00000000 00000001 // (2^0)=1 in dualer Schreibweise
-------------------
00000000 00000000 //Ergebnis nach der AND-Operation (=0)
06/14/2011 14:52 .BritainAndy#13
Ah, okay.

Also werden bei einem Tastenschlag bits gesetzt und mit dem bit operator & prüft man dies dann?

wenn ja, dann hab ich es glaub ich verstanden.
06/14/2011 15:26 xNopex#14
Keine Ahnung, was genau intern passiert, wenn du eine Taste drückst. Da werden wahrscheinlich auch iwelche Bits gesetzt, verschickt, etc.
Für dich wichtig ist einfach nur, dass GetAsyncKeyState() eine Variable vom Typ "short" zurückgibt. Eine Variable vom Typ short ist 16bit lang, entspricht also einem WORD = 2Byte. Laut MSDN repräsentiert das niedrigste Bit, ob die Taste nach dem letzten Aufruf von GetAsyncKeyState() gedrückt wurde oder nicht. Da du aber nur auf die 16bit insgesamt Zugriff hast und nicht auf das einzelne Bit des Rückgabewerts, nimmst du eine AND-Maske, um das niedrigste Bit herauszufiltern. Das niedrigste Bit ist an der Stelle 0, d.h. du musst mit dem Wert 2^0 = 1 = 0000000000000001 vergleichen. Mehr steckt da nicht dahinter.
06/14/2011 16:44 .BritainAndy#15
alles klar, habs dann verstanden, danke :-)