Abfragen, ob Taste aktiv.
-
Hi,
wie fragt man am besten ab, ob eine Taste aktive bzw. gedrückt ist (nicht kbhit())?
Habs mal mit GetAsyncKeyState() versucht, aber es muss doch bestimmt noch eine Funktion geben, die einfach einen bool-Wert zurück gibt.MfG Bazenrieder
-
Wenn Du erklärst, was Du eigentlich vor ha t kann an Dir vielleicht besser helfen... spontan fällt mir auch nichts besseres ein..
-
Wenn Du erklärst, was Du eigentlich vor hast kann man Dir vielleicht besser helfen... spontan fällt mir auch nichts besseres ein..
-
Wenn Du erklärst, was Du eigentlich vor hast kann man Dir vielleicht besser helfen... spontan fällt mir auch nichts besseres ein..
-
Was spricht gegen kbhit()?
MfG SideWinder
-
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.)