tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
444
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Hallo
    Eine Frage: GetAsyncKeyState möchte ich, dass es erst true liefert wenn ich die Taste losgelassen habe.
    Mit Folgendem Code: if( GetAsyncKeyState(VK_CONTROL) &0x1000) habe ich das problem ( in der Reder schliefe) Das wenn ich die taste gedrückt halte es immer wieder ausgeführt wird( die if verzweigung)
    Wie löse ich das?
    Windows, C++
    Danke
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  2. #2
    Avatar von De Handler
    De Handler De Handler ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    8
    Hallo,

    Bin mir nicht ganz sicher, aber ich würde es mit einer While-Schlaufe versuchen:

    if(Gedrückt)
    {
    while(Gedrückt){}
    // Weiterfahren, Taste losgelassen
    }

    De Handler
     
    Pascal-Müller.ch, meine Bilder.

  3. #3
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    @deHandler: Das ist ja eben das Problem.
    Ich vermute mal, die "Reder schliefe" soll noch was machen.
    Deine Lösung blockiert alles.

    Und noch ein Hinweis auf die Codetags: [cpp]...[/cpp].

    @Msvc++:
    a) Mach zusätzlich eine Variable, die den letzten bekannten Tastenstatus speichert.
    Wenn GetAsyncKeyState "nicht gedrückt" liefert und die Variable aber auf "gedrückt"
    steht, ist die Taste gerade losgelassen worden.

    b) kA., unter welchen Bedingungen du entwickelst,
    aber was wäre mit WM_KEYUP?

    Gruß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  4. #4
    Avatar von De Handler
    De Handler De Handler ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    8
    Hallo,

    Im folgenden Code wird der Programmablauf nicht mehr gesperrt. Die Funktion kann aber nur für eine Taste verwendet werden. (Da nur eine Variable)

    Den Code hab ich getestet. sollte also funktionieren.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    #include <windows.h>
    #include <stdio.h>
     
    bool bKPress = false;     // Globale Variable, zum Speichern ob beim letzten Durchgang gedrückt wurde
     
    bool KeyUp( int vKey)
    {
         if( GetAsyncKeyState( vKey ) )
         {
                bKPress = true;
         }
         else
         {
               if( bKPress )
               {
                     bKPress = false;
                     return true;
               }
         }
     
         return false;
    }
     
    int main()
    {
        while(!KeyUp ( VK_CONTROL )) {}   // Ja hier wird blockiert, irgendwas muss das 
                                          // Beispiel auch machen
        
        printf("CTRL losgelassen");
     
        system("pause");
    }

    @sheel, hab nur php-Tags gefunden.
     
    Pascal-Müller.ch, meine Bilder.

  5. #5
    Eburneolus Eburneolus ist offline Mitglied
    Registriert seit
    Mar 2011
    Beiträge
    15
    Hier ist noch ein Beispiel für mehrere Tasten.
    In der While - schleife können dann noch sonstige gewünschte Prozesse ausgeführt werden, ohne, dass das Programm blockiert.
    Im enum sind auch noch mal die States von GetAsyncKeyState() definiert.
    Doku: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    #include <windows.h>
    enum
    {
        MAX_KEY = 128,
        TOGGLE = -32767,
        NOT_PRESSED = 0
    };
     
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hprev, LPSTR CmdLn, int CmdShow)
    {
        short state = 0;
        int proceed = 1;
        
        short key = 0;
        short keypressed[MAX_KEY]; // initialize it with 0 values
        
        while (proceed) //as long as proceed != 0 watch the state of Keys
        {
            for (key = 1; key < MAX_KEY; key++) // instead of for loob one specified key can be monitored
            {
                state = GetAsyncKeyState(key);
                if (state <= TOGGLE)
                {
                    if (keypressed[key] == 0)
                    {
                        //proceed given Key from for loop when first time pressed
                        keypressed[key] = 1;    
                    }
                }
                else if (state >= NOT_PRESSED)
                {
                    if (keypressed[key] !=  0)
                    {
                        //proceed Key after state TOGGLE has been released
                        keypressed[key] = 0;
                    }   
                }       
            }
            Sleep(5);
        }
    }
     

Ähnliche Themen

  1. Gedrückt-halten- und Loslassen-Funktionen
    Von Wiz im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 24.10.11, 16:50
  2. Tabindex statt Tab-Taste mit Enter-Taste
    Von tanjahouse im Forum Javascript & Ajax
    Antworten: 10
    Letzter Beitrag: 19.11.09, 10:06
  3. Fenster beim loslassen (onRelease) zurücksetzen/bewegen ?!
    Von angelikamorgan im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 24.06.08, 20:24
  4. Wie auf SWT.Min Ereignis reagieren?
    Von Ronin-Jay im Forum Java
    Antworten: 2
    Letzter Beitrag: 20.04.07, 13:58
  5. Greifer soll loslassen...
    Von redybull im Forum Cinema 4D
    Antworten: 16
    Letzter Beitrag: 02.08.04, 11:29