Forum: PC-Programmierung C - Programm - Tastaturpuffer einlesen bzw. abfragen ob Taste gedrückt


von Autor (Gast)


Lesenswert?

Hallo,


habe hier ein kleines Problem bei meinem C Programm. Ich hoffe ihr könnt 
mir weiterhelfen.
Folgendes:

Das Programm soll im Hintergrund laufen und immer wieder die Systemzeit 
aktualisieren ( also die While Schleife durchlaufen ) bis der Benutzer 
im Spiel eine bestimmte Taste drückt. In dem Fall "DEL".
Dann soll das Programm automatisch die Schleife fertig arbeiten und dann 
zur Eingabe mittels Scanf zurückkehren.

Allerdings scheint das "while (getch() != '127')" nicht zu 
funktionieren....

Außerdem läuft er die While Schleife immer erst durch, sobald ich 
irgendeine Taste drück (Wäre besser wenn er sie kontiniuerlich 
durchlaufen würde, damit die Systemzeit schön aktualisiert wird.).


Wundert euch bitte nicht über die Namen, sollte eben ein kleines 
Hilfsprogramm zu nem Spiel werden.



mfg




<code>

#include <windows.h>
#include <stdio.h>
#include <time.h>



void main (int argc, char *argv[])
{
     int a,rl,rr,bl,br,dr,ba,eingabe;
     time_t startzeit;

     printf("LoL Jungle Timer V1.0\n\n");

     printf("Taste druecken - Sobald Spiel gestartet ist!!!!\n\n");
     system("Pause");

     startzeit=time(NULL);
     a=startzeit;

     rl=startzeit+115;
     rr=startzeit+115;
     bl=startzeit+115;
     br=startzeit+115;
     dr=startzeit+150;
     ba=startzeit+900;

     goto label1;






     while(1)
     {


     printf("Waehlen sie die Zahl:\n1. Roter Buff LINKS\n2. Roter Buff 
RECHTS\n3. Blauer Buff LINKS\n4. Blauer Buff RECHTS\n5. Drache\n6. 
Baron\n\n");


     printf("Eingabe: ");


     scanf("%d",&eingabe);


     while (getch() != '127')
     {


     if (eingabe == 1)
     {
          startzeit=time(NULL);
          rl=startzeit+300;
     }
     else if(eingabe == 2)
     {
          startzeit=time(NULL);
          rr=startzeit+300;

     }
     else if(eingabe == 3)
     {
          startzeit=time(NULL);
          bl=startzeit+300;

     }
     else if(eingabe == 4)
     {
          startzeit=time(NULL);
          br=startzeit+300;

     }
     else if(eingabe == 5)
     {
          startzeit=time(NULL);
          dr=startzeit+360;

     }
     else if(eingabe == 6)
     {
          startzeit=time(NULL);
          ba=startzeit+420;

     }
     else
     {
         printf("Falsche Eingabe!");
     }




     label1:



     startzeit=time(NULL);
     a=startzeit;

     system("CLS");

     printf("Aktuelle Systemzeit:                    %s\n",ctime(&a));
     printf("Spawnzeitpunkt Roter Buff Links:        %s\n",ctime(&rl));
     printf("Spawnzeitpunkt Roter Buff Rechts:       %s\n",ctime(&rr));
     printf("Spawnzeitpunkt Blauer Buff Links:       %s\n",ctime(&bl));
     printf("Spawnzeitpunkt Blauer Buff Rechts:      %s\n",ctime(&br));
     printf("Spawnzeitpunkt Drache:                  %s\n",ctime(&dr));
     printf("Spawnzeitpunkt Baron:                   %s\n",ctime(&ba));



     }


     }


}



</code>

von rhdfztk (Gast)


Lesenswert?


von Autor (Gast)


Lesenswert?

Das habe ich auch schon gefunden. Allerdings bin ich bzgl. des Syntax 
etc. etwas verwirrt. Könntest du mir ein kleines Beispiel geben wie man 
die DEL Taste dabei überprüft? Muss ich dazu noch eine lib einbinden?

von rhdfztk (Gast)


Lesenswert?

1
esc=GetAsyncKeyState(VK_ESCAPE);
Ich würde mal vermuten für DEL passt dann VK_DEL oder VK_DELETE... SHORT 
müsste 16bit sein, Header windows.h, Libs keine.

von Autor (Gast)


Lesenswert?

while (del=GetAsyncKeyState(VK_DEL) != 1);

Er durchläuft sie solange bis del = 1 ist richtig?

Dann bringt er mir die Meldung VK_DEL sei nicht deklariert.
Ich deklariere es, dann hängt er sich nach der Eingabe beim Eintritt in 
die While Schleife auf.

:(

von Autor (Gast)


Lesenswert?

VK_DELETE funktioniert besser, dann muss man die Variable schonmal nicht 
deklarieren.

Trotzdem hängt er sich dabei auf. Entweder ich überseh grad n Fehler im 
Programm oder es klappt so nicht.

von rhdfztk (Gast)


Lesenswert?

Autor schrieb:
> while (del=GetAsyncKeyState(VK_DEL) != 1);
>
> Er durchläuft sie solange bis del = 1 ist richtig?
Ich meine da fehlen Klammern (die Operatorenreihenfolge konnte ich mir 
noch nie merken).

>
> Dann bringt er mir die Meldung VK_DEL sei nicht deklariert.
Och Mensch nochmal, guck doch mal in die winuser.h, dann wüsstest du das 
es
VK_DELETE heißen muss.
1
#define VK_DELETE  46

> Ich deklariere es, dann hängt er sich nach der Eingabe beim Eintritt in
> die While Schleife auf.
Mit welchem Wert denn? Ne, so wird das natürlich nichts. Ohne dir zu 
nahe treten zu wollen, besonders viel Programmiererfahrung hast du nicht 
oder?

> VK_DELETE funktioniert besser, dann muss man die Variable schonmal nicht
> deklarieren.
UARGHS! Das ist keine Variable!!!

von rhdfztk (Gast)


Lesenswert?

Wart mal fünf Minuten, ich bastel mal ein Beispielprogramm.

von rhdfztk (Gast)


Lesenswert?

So, bitte sehr...
1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <stdint.h>
4
#include <windows.h>
5
6
int main (int argc __attribute((__unused__)), char **argv __attribute((__unused__)))
7
{
8
  uint16_t del_pressed;
9
  printf("Beenden mit DELETE!\n");
10
  while(!GetAsyncKeyState(VK_DELETE))
11
  {
12
    del_pressed=GetAsyncKeyState(VK_ESCAPE);
13
    if(del_pressed)
14
      printf("Escape gedrueckt!\n");
15
    else
16
      printf("Escape nicht gedrueckt!\n");
17
    Sleep(50);
18
  }
19
  return 0;
20
}

von Autor (Gast)


Lesenswert?

Dankeschön, Hast schon Recht ich hatte nur nen 3 Wochen C-Crashkurs in 
der Firma :).

von Rolf M. (rmagnus)


Lesenswert?

rhdfztk schrieb:
> int main (int argc __attribute((_unused_)), char **argv 
__attribute((_unused_)))

Was soll der Unsinn denn? Wenn du argc und argv nicht benutzt, dann 
definiere sie nicht. Das ist sinnvoller, als sie zu definieren und dann 
mit compilerspezifischen Erweiterungen den Code unleserlicher zu machen, 
nur damit der Compiler weiß, daß du die mit Absicht gar nicht benutzt.

von rhdfztk (Gast)


Lesenswert?

Rolf Magnus schrieb:
> rhdfztk schrieb:
>> int main (int argc __attribute((_unused_)), char **argv
> __attribute((_unused_)))
>
> Was soll der Unsinn denn? Wenn du argc und argv nicht benutzt, dann
> definiere sie nicht.
Ist das denn erlaubt? Bin kein C-Profi...

von Rolf M. (rmagnus)


Lesenswert?

Ja.Ein konformer Compiler muß auf jeden Fall die argc/argv-Variante und 
die ganz ohne Parameter akzeptieren.

von Autor (Gast)


Lesenswert?

Das Programm funktioniert soweit :).

Ist es möglich das Programm Transparent in dem Spiel anzeigen zu lassen?

D.h. im Spiel sehe ich Rechts oben z.B dann die verbleibende Zeit bis 
das Ereignis passiert.

von rhdfztk (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Ja.Ein konformer Compiler muß auf jeden Fall die argc/argv-Variante und
> die ganz ohne Parameter akzeptieren.

Gut zu wissen, danke für die Info. Sieht gleich viel eleganter aus. :-)

(Ich dachte argc/argv seien Pflicht und wollte die Warnungen "unused 
variable" wegbekommen.)

Autor schrieb:
> Ist es möglich das Programm Transparent in dem Spiel anzeigen zu lassen?
>
> D.h. im Spiel sehe ich Rechts oben z.B dann die verbleibende Zeit bis
> das Ereignis passiert.

Gehen tut das vermutlich, aber nicht ohne größeres Gebastel mit der 
Windows-API. Ich kenne mich da nicht aus und imho ist das nichts für 
Anfänger...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.