2012-03-27 6 views
1

Hey Leute, ich habe eine Frage, nach der ich schon lange gesucht habe, ich habe viele Fragen gleich gesehen, aber keine hat mein Problem gelöst.C++ Clearing cin Puffer bei der Verwendung von GetAsyncKeyState()

Also habe ich eine Funktion, die den Spielernamen mit get-Linie ergreift, die so geht.

std::cout << "Enter your name"<< std::endl; 
std::string input; 

std::getline(std::cin, input); 

und danach habe ich eine Funktion, die ein Menü hat, die den Benutzer sagt, dass er eine Reihe von Tasten drücken, um auf andere Teile des Menüs zu bewegen.

while(true) 
{ 
     //menu one 
     if(GetAsyncKeyState(VK_CONTROL)) 
     { 
      Menu_3(); 
     } 
     //here is the problem 
     if(GetAsyncKeyState(VK_SHIFT) && GetAsyncKeyState(0x53)) //0X53 = S 
     { 
      Menu_4(); 
     } 
} 

Mein Problem ist, dass, wenn ich einen Namen mit einem Großbuchstaben verwenden (mit SHIFT erstellt) und einem ‚s‘ auch Menu_4() automatisch aufgerufen wird, nachdem ich den Namen, zB Namen „Shawn“ eingeben. Wenn ich nur einen Namen wie diesen "Shawn" habe (ohne Shift zu benutzen), dann scheint dieses "s" im cin-Puffer gespeichert zu werden und alles was benötigt wird um fortzufahren ist "shift" um in Menu_4() zu gelangen;

Im Grunde wird die Eingabe von der Getline-Namensanforderung übernommen und die Aufrufe von GetAsyncKeyState() durcheinander gebracht.

Danke für Ihre Hilfe.

Antwort

2

Ich denke, das Verhalten von GetAsyncKeyState

siehe GetAsyncKeyState

Wenn die Funktion erfolgreich ist, ist der Rückgabewert gibt an, ob der Schlüssel seit dem letzten Aufruf von GetAsyncKeyState gedrückt wurde falsch verstanden, und ob die Die Taste ist momentan auf oder ab. Wenn das höchstwertige Bit gesetzt ist, ist die -Taste gedrückt, und wenn das am wenigsten signifikante Bit gesetzt ist, war der Schlüssel nach dem vorherigen Aufruf gedrückt GetAsyncKeyState

...

Obwohl die niedrigstwertige Bit des Rückgabewerts gibt an, ob die Taste seit der letzten Abfrage gedrückt wurde, aufgrund der präventiven Multitasking-Eigenschaft von Windows kann eine andere Anwendung GetAsyncKeyState aufrufen und das "zuletzt gedrückte" Bit anstelle von Ihrer Anwendung erhalten. Das Verhalten des niedrigstwertigen Bits des Rückgabewerts wird ausschließlich für die Kompatibilität mit 16-Bit Windows-Anwendungen (die nicht präventiv sind) beibehalten und sollte nicht sein.

Wahrscheinlich möchten Sie den aktuellen Status nicht überprüfen, wenn die Taste vom letzten Anruf gedrückt wurde.

if(GetAsyncKeyState(VK_CONTROL) xor 0x1) 
.... 
+0

Oh ich sehe, aber warum hast du einen xor da, was soll das denn definiert werden? Danke – user1143896

+0

Ich habe es, ich musste GetAsyncKeyState (VK_SHIFT) & 0x8000, danke für Ihre Hilfe. – user1143896

+2

'Xor 0x1' schaltet nur das LSB um, dies ist nicht korrekt. Und auch: MS dokumentiert das MSB und das LSB, MS sagt nichts über die Bits dazwischen aus. Selbst das Überprüfen von 'if (GetAsyncKeyState (...) & ~ 0x1)' ist im Falle zukünftiger API-Änderungen fehleranfällig. Überprüfen Sie 'GetAsyncKeyState (...) & 0x8000' ist der Weg zu gehen. –

1

Sie nehmen nur den Rückgabewert von GetAsyncKeyState(), so effektiv if(GetAsyncKeyState() != 0) tun. Die docs sagen

Wenn die Funktion erfolgreich ist, gibt den Rückgabewert, ob der Schlüssel seit dem letzten Aufruf von GetAsyncKeyState gedrückt wurde und ob der Schlüssel ist zur Zeit nach oben oder unten.Wenn das höchstwertige Bit gesetzt ist, ist der Schlüssel inaktiv, und wenn das niedrigstwertige Bit gesetzt ist, wurde der Schlüssel nach dem vorherigen Aufruf von GetAsyncKeyState gedrückt.

So überprüfen Sie derzeit, ob die Taste jetzt gedrückt wird oder ob die Taste seit dem letzten Aufruf von GetAsyncKeyState gedrückt wurde. Wenn Sie nur überprüfen möchten, ob die Taste jetzt gedrückt wird, müssen Sie prüfen, ob das höchstwertige Bit des Rückgabewertes gesetzt ist.