Taste gedrückt halten -> Zeit messen



  • Hallo zusammen!

    Ich hab schon die SDL Lib durchgestöbert um hinter das geheimnis des EVENT Handlings des Keyboards zu kommen... bin aber vergeblich daran gescheitert...

    Weis jemand wie man am besten die Zeit misst wie lange eine Taste gedrückt wurde?
    in der Win32 Console..... Ansi C oder C++
    in den standard Bibliotheken gibs ja keine "Keyrelease Event" oder doch ?

    Ich verwende einen GNU Compiler (Bloodseeht)

    für tips herzlichen dank im voraus..



  • Moin!

    *pushpush*

    In der Theorie sicherlich sowas wie:

    +-----------------+      +---------------+
    ! Taste gedrückt  ! ---> ! Timer starten ! 
    +-----------------+      +---------------+
    
    +-----------------+      +---------------+
    ! Taste loslassen ! ---> ! Timer stoppen !
    +-----------------+      +---------------+
                                     |
                                     v
                             +--------------------+
                             ! Timer auf 0 setzen !
                             +--------------------+
    

    Ich frage mich allerdings, ob man das nicht lieber unter Windows schreibt, da dein Programm ja die meiste Zeit auf eine Eingabe wartet.

    Wenn ich jetzt anfange, darüber "Herumzuphilosofieren"

    #include <stdio.h>
    #include <time.h>
    
    int main ()
    {
        int iTasteDauer;
        int iTasteWelche;
    
        /* Dann wird es kompliziert. stdin sollte - denke ich - das Stichwort sein.
    "getchar()" können wir ausschließen, da wir ja auch die dauer des "Tasten-Drückens" 
    haben wollen. Ich habe ab hier keine Ahnung. */
    

    Hat jemand vieleicht eine Idee?

    EDIT: Manno 😞 Suchen bringt nichts
    Mal 'ne Anregung an die Moderatoren: Das wäre doch mal was für die FAQs, oder?



  • Für die FAQ wärs erst was wenns beantwortet ist ;).

    Naja meiner einer schlägt vor mit PeekConsoleInput() sozusagen ein kbhit() mit Timer-Funktion zu bauen. Mal sehen ob es High-Level auch geht:

    char lastkey = 0;
    
    while(true)
    {
         if(kbhit())
         {
             char newkey = getch();
             if(lastkey)
             {
                 if(newkey == lastkey)
                 {
                     break;
                 }
             }
             else
             {
                 lastkey = newkey;
             }
         }
    }
    

    Sowas in die Richtung. Gehört natürlich noch erweitert: Derzeit funktionieren nur "normale Tasten" ohne Sondercodes, etc. hab nichtmal Ahnung ob das so HighLevel funktioniert.

    Wenn nicht, schau dir mal INPUT_RECORD an, da gibts Informationen zum wie vielten Mal die Taste bereits aktiviert wurde, dann kannste solange diese Zahl um eins höher ist als das letzte mal den Timer weiterlaufen lassen, etc.

    MfG SideWinder



  • INPUT_RECORD
    Mh, ich werde nicht so richtig schlau aus der Suche. Kannst du mir einen Tipp geben?
    Auch werde ich aus deinem Code nicht schlau 😞 .
    Ich habe auch gar keine Ahnung, wie man dieses Programm realisieren soll.

    Happy Coding! der flyingCoder (so langsam fange ich an, dieses Pseudonym nicht mehr zu mögen ...)



  • Er hat ne einfache Endlosschleife die ununterbrochen abfrägt ob die gedrückte Taste
    noch die gleiche ist und wenn nicht wurde sie losgelassen und die Schleife bricht
    ab.



  • Ah, ja... Jetzt sehe ich's auch! Danke!
    Ich habe hier keine Dokumentation über <time.h>, aber ich hab in dem Referenzteil, meines "Programmieren in C" von Brian Kernighan und Dennis Ritchie, nachgeguckt. Deshalb bin ich mir nicht so sicher.

    Vieleicht ist das eine Idee:

    #include <stdio.h> 
    #include <conio.h>
    #include <time.h>
    
    struct Taste {
        char welche;
        int zeit_in_ms;
    };
    
    Taste Ausfuehren ();
    
    int main ()
    {
        struct Taste taste;
        char auswahl;
    
        printf("\nDieses Programm misst, welche Taste Sie wie lange gedrückt halten");
        do
        {
            taste = Ausfuehren ();
            printf("\nSie haben '%s' %d Millisekunden festgehalten!", taste.welche, taste.zeit_in_ms);
            printf("\n\nnochmal? [J/N]");
            auswahl = getch ();
        } while (auswahl == 'j' || auswahl == 'J')
            ;
    
        return 0;
    }
    
    Taste Ausfuehren ()
    {
        char lastkey;
        struct Taste taste;
    
        for (;;) {
           if(kbhit()) 
           { 
               taste.welche = getch();
                STARTE_TIMER!!!
               if(lastkey) 
               { 
                   if(newkey == lastkey) 
                   { 
                       break; 
                        BEENDE_TIMER!!!
                   } 
               } 
               else 
               { 
                   lastkey = taste.welche; 
               } 
           }
        }
    
        return taste;
    }
    

    Ich weiß nicht, wie man diesen doofen Timer einbaut!!! 😡 😡

    MFG, the flyingCoder.


Log in to reply