Abfragen, ob Taste aktiv.
-
bei kbhit() kann immer nur eine Taste abgefragt werden, wenn aber 2 Tasten gedrückt werden, wird eine ignoriert. Auserdem wird bei kbhit() übergangen, wenn die Taste dauerhaft gedrückt wird.
-
Alle Tasten kannst Du mit "GetKeyboardState" auf einmal abfragen.
-
die Funktion hatte ich schon mal... nur mach ich da anscheinend irgendetwas falsch..
while(GetKeyboardState(VK_ESCAPE)==0) { }
Was ist daran falsch?
-
Vermutlich kannst Du nicht die Doku lesen
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/getkeyboardstate.asp
-
MSDN schrieb:
BOOL GetKeyboardState (PBYTE lpKeyState);
lpKeyState
[in] Pointer to the 256-byte array that receives the status data for each virtual key.Heißt in Code umgesetzt:
char keystate [256]; GetKeyboardState(keystate); if(keystate[VK_ESCAPE]) cout << "Escape gedrückt" << endl;
MfG SideWinder
-
@Jochen: hrhr, so hätte ich es auch formulieren können
MfG SideWinder
-
Jochen Kalmbach schrieb:
Vermutlich kannst Du nicht die Doku lesen
[url]http://msdn.microsoft.com/library/en-us/ (...)[/url]Hab das mit dem Pointer nicht so ganz verstanden.
Denn wo soll ich denn da einen Zeiger erhalten?
BOOL GetKeyboardState(PBYTE lpKeyState
);der Eingabewert ist von Typ PBYTE und der Rückgabewert ist BOOL... seh aber nichts von einem Zeiger.
und...
char keystate [256]; GetKeyboardState(keystate); if(keystate[VK_ESCAPE]) cout << "Escape gedrückt" << endl;
...schneint nicht zu funktionieren, und zwar sagt er:
error C2664: 'GetKeyboardState': Konvertierung des Parameters 1 von 'char [256]' in 'PBYTE' nicht möglich
-
Mach einfach aus dem "char" ein "BYTE", dann passt es...
-
ich weiß... langsam geh ich richtig auf die Nerven...
aber es geht immer noch nicht ...Der regiert einfach nicht auf den Tastendruck.
Und wenn ich dann die Variable keystate[VK_ESCAPE] ausgeben lass, gibs nur ein Leerzeichen (oder soetwas).
-
Die einfachste Lösung ist:
#include <stdio.h> #include <windows.h> #include <tchar.h> int _tmain() { BYTE keystate [256]; do { USHORT us = (USHORT)GetKeyState(VK_ESCAPE); if ( (us & 0x8000) == 0x8000) break; Sleep(1); } while(TRUE); }
-
danke.
aber ich hätte noch 2 Fragen:
Was bedeutet (us & 0x8000) == 0x8000)?
0x8000 ist immer 0x8000 also warum muss man das extra nochmal prüfen und für was steht 0x8000?Und wie schaff ich es, dass er auf Buchstaben reagiert?
-
Ich mag halt explizite Überprüfungen... du kannst das " == 0x8000" aber auch weglassen...
Auf den Wert 0x8000 kommt man wenn man die Doku liest...Wie buchstaben... Du meinst wohl
USHORT us = (USHORT)GetKeyState('A');
-
Jochen Kalmbach schrieb:
Ich mag halt explizite Überprüfungen... du kannst das " == 0x8000" aber auch weglassen...
Hab übersehen, dass es das "Bitweise-Und" ist
Und kann man nicht weglassen..Jochen Kalmbach schrieb:
Wie buchstaben... Du meinst wohl
USHORT us = (USHORT)GetKeyState('A');
Geht leider nicht... und die Hexadezimal anzugeben funktioniert irgendwie auch nicht... sonst noch eine Idee?
Aber noch eine andere Frage:
Irgendwie scheint es, dass danch noch ein Zeichen im Keyboarpuffer ist, denn ein getch wird übergangen. Woran könnte das liegen? Wird das Zeichen nicht durch die Abfrage abgearbeitet?
-
Bei mir geht das wunderbar...
-
Irgendwelche Zeichen im Keyboard-Buffer werden natürlich nicht abgearbeitet (oder rausgeholt)... dazu verwendest Du bitte ReadFile oder ReadConsole(Input) (oder alles abgeleitete wie cin, scanf getch usw.)
-
Jochen Kalmbach schrieb:
Bei mir geht das wunderbar...
OK dachte, dass er zwischen Groß-/Kleinbuchstaben unterscheidet...
Aber so is es eh besser.Dann nochmal danke
-
Schau doch einfach mal in die "winuser.h" und such mal nach "VK_A", dann wirst Du sehen warum ich 'A' verwendet habe...