Taste abfragen
-
hi
hab die forumssuche schon benutzt, aber hab nur getch() gefunden, das will ich aber nicht.
ich suche eine funktion, die irgendwas mit getaskedkey oder so beginnt. wo man zbsp.
if([GESUCHTER_FUNKTIONS_NAME] == 27) //ESC { .. }
mir fällt die nur nicht ein
ich hoffe und danke, dass ihr mir helfen könnt.
-
Meinst Du GetKeyboardState oder kbhit?
-
ist ziemlich schwer zu beantworten.
ich hab früher glaub ich _getch() verwendet:
if(_getche() == 27) { ... }
aber da kommen merkwürdige Zeichen raus.. also so ein Pfeil, dann so ein "á" usw..
ich möchte eigentlich nur eine taste abfragen, am besten so wie ich es beim beispiel gezeigt hab: [FUNKTION] == TASTATURCODE, nur hab ich keinen Plan, wie ich das machen soll
wuerde mich ueber antworten freuen
cu
-
if(_kbhit() && _getch() == 27) { // ESC gedrückt! }
Siehe: http://msdn2.microsoft.com/en-us/library/078sfkak(VS.80).aspx
Header ist: <conio.h>
-
danke aber es passiert nicht das was passieren sollte
if(_kbhit() && _getch() == 27) { ... std::cout << "D.."; } else { std::cout << "::::::::"; }
er gibt sofort den ELSE aus , also ":::::".etc...
und wenn ich einen buchstaben drücke, dann wird ein buchstabe ausgegeben, anstatt den ":::::".
ich möchte das so:
zbsp:
if(ESC GEDRÜCKT?) { std::cout << "ENTER"; } else { std::cout << "ANDERE TASTE"; }
dass das keinen "eingegebenen" Buchstaben auf der Konsole zeigt, sondern nur die Ausgabe von den IF-ELSE-Zweigen.
wie mach ich das nnur?
mfg
-
Hi, guck dir das mal GetAsyncKeyState an.
http://msdn2.microsoft.com/en-us/library/ms646293.aspx
MfG WilMen :xmas1:
-
Geht´s nicht einfacher:
LRESULT CALLBACK WndProc(HWND HandleWindow,HINSTANCE HandleInstance,WPARAM wParam,LPARAM lParam,unsigned int message) { switch(message) { case WM_KEYDOWN: if (wParam == 27) { //Escape wurde gedrückt } break; case WM_DESTROY: PostQuitMessage(0) break; default: //DefWindowProc break; }
Wenn ihr das so macht geht es nur während dem Lauf der Hauptschleife(TranslateMessage,DisPatchMessage). Es sein den ihr macht das wie folgt:
switch((int)message->wParam) { case VK_ESCAPE: //Esc wurde gedrückt break; }
Als kleines Beispiel könnt ihr ja mal das hier versuchen:
while((int)message->wParam != VK_ESCAPE) { //Das Programm bleibt solange an dieser Stelle hier bis man Escape drückt }
Es gibt noch viele weitere Anwendungsmöglichkeiten aber im Grundsatz kann man hiermit das machen was der Themenstarter vorhatte. Der Nachteil der ganzen Sache ist:
Wenn die Botschaftsverarbeitung noch nicht in Gang ist dann kann überhaupt nicht auf das Fenster zugegriffen werden. Ausserdem muss man die message auch erst bevor man sie auswertet mit TranslateMessage(message) übersetzen lassen.
Deswegen bin ich auch der Meinung dass man das ganze entweder in die Hauptschleife einbaut(logischerweise ins WndProc) oder man macht eine Multithreaded Anwendung(was eigentlich immer zu vermeiden ist).P.S.:
:xmas2:
:xmas1:
-
Jo. Ich kann WilMen da nur zustimmen.
GetAsyncKeyState() ist da eindeutig die Funktion, die du brauchst, wenn du den Status einer Taste systemweit abfragen willst.
z.B. :
if ( GetAsyncKeyState (VK_ESCAPE)) { //Blablabla... }
GetKeyState gäbs auch noch...
Greetings, Xzi-bit
-
Xzibit schrieb:
Jo. Ich kann WilMen da nur zustimmen.
GetAsyncKeyState() ist da eindeutig die Funktion, die du brauchst, wenn du den Status einer Taste systemweit abfragen willst.
z.B. :
if ( GetAsyncKeyState (VK_ESCAPE)) { //Blablabla... }
GetKeyState gäbs auch noch...
Greetings, Xzi-bit
Jopp GetAsyncKeyState ist da echt nicht schlecht. Was meint ihr mit "systemweit"? Bedeutet soviel wie: messages an alle Handles, oder?
-
Deswegen bin ich auch der Meinung dass man das ganze entweder in die Hauptschleife einbaut(logischerweise ins WndProc) oder man macht eine Multithreaded Anwendung(was eigentlich immer zu vermeiden ist).
Hi! Eine Multithread-Anwendung ist natürlich in diesem Fall unangebracht bzw. unnötig. Aber es gibt Anwendungen, wo man Multithreading natürlich braucht (Beispiel: Spiel in dem parallel Musik läuft). Wozu wäre es sonst auch erfunden worden?
MfG WilMen
-
Wenn wir schon beim Thema sind:
Geht das hier?while (GetAsynckeystate(VK_ESCAPE)) { //Programm hält solange an bis Escape gedrückt wurde }
Kann man die Funktion so einsetzen?
-
Ja, es geht (mit der Änderung unten), ist aber nicht gerade sehr schön, da die Schleife so das System voll auslastet. Du müsstest, wenn du das überhaupt so machst noch eine Verzögerung
einbauen(http://www.c-plusplus.net/forum/viewtopic-var-t-is-39270.html).while (GetAsyncKeyState(VK_ESCAPE)) // TRUE, wenn Escape gedrückt { //Programm hält solange an bis Escape gedrückt wurde }
while (!GetAsyncKeyState(VK_ESCAPE)) // FALSE, wenn Escape gedrückt { //Programm hält solange an bis Escape gedrückt wurde }
Das Problem bei deinem Code war, dass die Schleife, wenn Escape NICHT gedrückt ist, sofort verlassen wird, da die Bedingung nicht erfüllt ist. Du musst den Rückgabewert einfach mit "!" negieren. Jetzt wird die Schleife erst verlassen, wenn du Escape gedrückt hast!
MfG WilMen :xmas1:
-
Ich kann es nicht ausprobieren.
Ich arbeite eh nur noch mit DirectInput
-
Wieso kannst du es nicht ausprobieren?
MfG WilMen