Auf Tastendruck warten??
-
Hi
ich hab folgenden code:bool setcharinput, //Wen true, dann wird inhalt von WM_CHAR ausgeführt inputsuccess; //Wenn true, wurde Taste gedrückt char inputvalue; LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //... case WM_CHAR: { MessageBox(NULL,"WM_CHAR","",MB_OK); if(setcharinput) { MessageBox(NULL,"WM_CHAR _INPUT","",MB_OK); inputvalue = wParam; setcharinput=false; inputsuccess=true; } else inputsuccess=false; }break; //... } bool input(char* value) { inputsuccess = false; setcharinput = true; //Eingabe freigeben //Was hier machen?? *value = inputvalue; //Zeichen einlesen return inputsuccess; }Wie kann ich jetzt, nachdem ich die eingabe freigegeben habe, warten, bis eine Taste gedrückt wurde??
Wenn ich da while(setcharinput); Hinmache, ist das Programm nicht mehr zu bedienen (Sanduhr-cursor wird angezeigt)ps.: Wie kann ich auf die hinteren Zeichen einer Schriftart zugreifen?? (z.B. Bei "Courier New" die Ganzen Linien und ecken, die ich auch in der Konsole zur verfügung habe??)
-
Hmm bin mir nicht ganz sicher
Du müsstest das WM_CHAR nochmal innerhalb der Windowsmessage
WM_KEYDOWN einschachtel oder ersetz doch_mal das WM_CHAR gegen WM_KEYDOWN
WM_KEYDOWN sollte alles was von der Tastatur kommt abfangen.
Wenn das geht kannst du dich weiter vorarbeiten.Gruss sclearscreen

-
Welche Taste gedrueckt worden ist ist im übrigen in eimem der zwei Parameter
WPARAM wParambzw.
LPARAM lParam.
enthalten. Nachdem WM_KEYDOWN bzw. WM_CHAR eingetreten ist!
Musst aber mal weiter in der MSDN nachsuchen, hatte lange mehr nichtsmehr am Hut
mit WinAPI!Grüsse

-
sorry habe deinen Post flasch verstanden, stelle ich gerade fest! Soory!
Aber jetzt:
bool input(char* value) { inputsuccess = false; setcharinput = true; //Eingabe freigeben //Was hier machen?? *value = inputvalue; //Zeichen einlesen return inputsuccess; }Wenn Du bei:
//Was hier machen??Die Tastaur sperren willst nur um auf einen Tastendruck zu warten
verstösst Du gegen den Nachrichtenbehandlungsmechanismus von Windows,
Dann blockierst Du deine gesamte Anwendung, das geht nicht kein Wunder
wenn eine Sanduhr kommt!!!!!!!!!!!!!!!!!!!!!!!!!!
Du blockierst Windows damit in folgender Sachewhile (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); }Mit freundlichen Gruessen

-
weil deine Anwendung dann eben in deiner selbstgeschriebenen Routine
hängenbleibt

-
Du sollteswt dir bei eintreffen von WM_KEYDOWN oder wie bei dir bei WM_CHAR,
in einer statischen Variablen merken das jetzt Tastaureigaben gemacht werden
um dann den ParameterlParamauf fuer dich relevante Tasten prüfen!
Hinweis: Bau wenn es geht keine Schleifen in Hauptnachrichtenbehandlungroutinen
von Fenstern ein! Wenn Du schleifen einbaust dann sei dir genau über deren
Abbruchbedingung im Klaren!!!!

-
Hier damit kannst die Taste anzeigen die gedrückt wird!
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static TCHAR key[2]; switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; case WM_CHAR: GetKeyNameText(lParam,key,sizeof(key)/sizeof(TCHAR)); MessageBox(0,key,"Taste",0); break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }habs mal in meine Compiler getestet, ich denke darauf kannste weiter aufbauen!
Mit besten Gruessen! Passe Deine Code entsprechend an wie Du möchtest!
-
Aber das mit den Schleifen in der Fensterprozedur meine ich immer noch so ernst!
Diesen Ratschlag bitte beherzigen!
Sonst kommt die Sanduhr öfters mal weil Deine Anwendung dann keine Zeit fuer Dich hat!
