tasten wiederholungsrate



  • Hi,
    es ist ja möglich mit getch() alle tasten auszulesen. Aber wenn ich jetzt eine taste gedrückt halte, dann dauert es erst ein bischen, bis sich diese taste wiederholt, allerdings is das ja z.B. in egoshootern nich der fall. Welchen befehl muss ich daführ benutzen? Oder gibt es nen befehl, der erkennt, wann die taste gedrückt ist, und wann sie wieder losgelassen wurde?
    thx im voraus
    MfG Kenny



  • Hi,
    Bei EgoShootern läuft es über DirectInput, das ist leicht anders als bei der Konsolenprogrammierung! 😉
    Aber für die Konsole gibt es eine Funktion _kbhit()
    p.s. Zur nettigkeit, musste auch gerade nachgucken, aber hier der Artikel aus der MSDN zur Funktion:

    _kbhit
    Checks the console for keyboard input.
    
    int _kbhit( void );
    
    Routine Required Header Compatibility 
    _kbhit <conio.h> Win 95, Win NT 
    
    For additional compatibility information, see Compatibility in the Introduction.
    
    Libraries
    
    LIBC.LIB Single thread static library, retail version 
    LIBCMT.LIB Multithread static library, retail version 
    MSVCRT.LIB Import library for MSVCRT.DLL, retail version 
    
    Return Value
    
    _kbhit returns a nonzero value if a key has been pressed. Otherwise, it returns 0.
    
    Remarks
    
    The _kbhit function checks the console for a recent keystroke. If the function returns a nonzero value, a keystroke is waiting in the buffer. The program can then call _getch or _getche to get the keystroke.
    
    Example 
    
    /* KBHIT.C: This program loops until the user
     * presses a key. If _kbhit returns nonzero, a
     * keystroke is waiting in the buffer. The program
     * can call _getch or _getche to get the keystroke.
     */
    
    #include <conio.h>
    #include <stdio.h>
    
    void main( void )
    {
       /* Display message until key is pressed. */
       while( !_kbhit() )
          _cputs( "Hit me!! " );
    
       /* Use _getch to throw key away. */
       printf( "\nKey struck was '%c'\n", _getch() );
       _getch();
    }
    
    Output
    
    Hit me!! Hit me!! Hit me!! Hit me!! Hit me!! Hit me!! Hit me!!
    Key struck was 'q'
    

    Ich hoffe, dass es das war, was du suchst! 😉

    [ Dieser Beitrag wurde am 19.09.2002 um 22:11 Uhr von HolyMetaler editiert. ]



  • Willst du nun die Tastenwiederholungsrate in der Konsole höher stellen? Oder willst du wissen ob eine Taste gedrückt ist?

    MfG SideWinder



  • erstma thx an HolyMetaler
    allerdings wollte ich wissen, ob eine taste gedrückt ist, und wann sie losgelassen wurde!
    MfG Kenny



  • Wenn du wissen möchtest, ob eine Bestimmte Taste gedrückt wurde, kannst du es so machen, hoffe ich mal, ist ungetestet:

    int ch;
    do
    {
        ch = _getch();
        ch = toupper( ch ); // Wenn es dir egal ist, ob die Taste groß getippt wurde, oder nicht
    } while( ch != '/*Taste die du möchtest */' );
    

    <edit> Ist aber glaube ich kein Standard. 🙄 </edit>

    [ Dieser Beitrag wurde am 22.09.2002 um 22:06 Uhr von HolyMetaler editiert. ]



  • Du könntest es ja so machen

    PSEUDOCODE!!

    if(SPACE_TASTE_GEDRÜCKT) SPACE_TASTE=TRUE;
    else SPACE_TASTE=FALSE;
    if(SPACE_TASTE)
    {
       //SPACE TASTE IST GEDRÜCKT
       flag=1;
    }
    if(SPACE_TASTE==FALSE && falg==1)
    {
      //TASTE WAR GEDRÜCKT UND WURDE LOASGELASSEN
      flag=0;
    }
    


  • ich hab das gefühl, das das falsch rübergekommen ist, weil wenn ich jetzt z.B.

    while(1)
    {
    taste=-1;
    if(kbhit()){taste=getch();} 
    if(taste>=0){cout<<"Es wird im mom eine taste gedrückt!";}
    if(taste==-1){cout<<"Keine Taste wird im mom gedrückt!";}
    Sleep(100);
    }
    

    diesen code habe, das prog starte, und nach dem ersten coutausgabe die Lehrtaste GEDRÜCKT halte, wird folgendes ausgegeben:

    Keine Taste wird im mom gedrückt!
    Es wird im mom eine taste gedrückt! //hier hab ich die taste gedrückt
    Keine Taste wird im mom gedrückt! //hier halte ich sie immer noch gedrückt
    Keine Taste wird im mom gedrückt! //und trotzdem wird angezeigt, das ich die
    Keine Taste wird im mom gedrückt! //taste nicht mehr drücke!
    Es wird im mom eine taste gedrückt!
    Es wird im mom eine taste gedrückt!
    Es wird im mom eine taste gedrückt!
    Keine Taste wird im mom gedrückt! //hier hab ich sie losgelassen

    Ich hoffe, das es jetzt richtig rübergekommen ist. 🙂
    Aber trotzdem danke für eure antworten!!!

    MfG kenny



  • Kennst du dich mit ReadConsoleInput() aus? Im KEY_EVENT_RECORD steht nämlich zum wievielten mal die Taste bereits einen Event auslöst! Den kannst du dann abrufen - der wird bei kbhit() nicht abgerufen!

    MfG SideWinder



  • ne sry, diese funktion kenn ich noch nich, und aus der wincon.h werd ich leider auch nich schlau 😞
    KEY_EVENT_RECORD sagt mir natürlich auch nix. kannst du mir vieleicht zeigen, wie diese funktion angewendet wird?
    MfG Kenny



  • Also:

    ReadConsoleInput
    The ReadConsoleInput function reads data from a console input buffer and removes it from the buffer.

    BOOL ReadConsoleInput(
    HANDLE hConsoleInput, // handle to a console input buffer
    PINPUT_RECORD lpBuffer, // address of the buffer for read data
    DWORD nLength, // number of records to read
    LPDWORD lpNumberOfEventsRead
    // address of number of records read
    );

    Parameters
    hConsoleInput
    Handle to the input buffer. The handle must have GENERIC_READ access.
    lpBuffer
    Pointer to an INPUT_RECORD buffer that receives the input buffer data.
    nLength
    Specifies the size, in input records, of the buffer pointed to by the lpBuffer parameter.
    lpNumberOfEventsRead
    Pointer to a 32-bit variable that receives the number of input records read.
    Return Values
    If the function succeeds, the return value is nonzero.

    If the function fails, the return value is zero. To get extended error information, call GetLastError.

    Remarks
    If the number of records requested in the nLength parameter exceeds the number of records available in the buffer, the number available is read. The function does not return until at least one input record has been read.

    A process can specify a console input buffer handle in one of the wait functions to determine when there is unread console input. When the input buffer is not empty, the state of a console input buffer handle is signaled.

    To determine the number of unread input records in a console's input buffer, use the GetNumberOfConsoleInputEvents function. To read input records from a console input buffer without affecting the number of unread records, use the PeekConsoleInput function. To discard all unread records in a console's input buffer, use the FlushConsoleInputBuffer function.

    Windows NT: This function uses either Unicode characters or 8-bit characters from the console's current code page. The console's code page defaults initially to the system's OEM code page. To change the console's code page, use the SetConsoleCP or SetConsoleOutputCP functions, or use the chcp or mode con cp select= commands.

    Da siehst du nun, dass du eine Struktur vom Typ "INPUT_RECORD" übergeben musst:

    INPUT_RECORD
    The INPUT_RECORD structure is used to report input events in the console input buffer. These records can be read from the input buffer by using the ReadConsoleInput or PeekConsoleInput function, or written to the input buffer by using the WriteConsoleInput function.

    typedef struct _INPUT_RECORD { // ir
    WORD EventType;
    union {
    KEY_EVENT_RECORD KeyEvent;
    MOUSE_EVENT_RECORD MouseEvent;
    WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
    MENU_EVENT_RECORD MenuEvent;
    FOCUS_EVENT_RECORD FocusEvent;
    } Event;
    } INPUT_RECORD;

    Members
    EventType
    Handle to the type of input event and the event record stored in the Event member.
    This member can have one of the following values: Value Meaning
    KEY_EVENT
    The Event member contains a KEY_EVENT_RECORD structure with information about a keyboard event.
    MOUSE_EVENT
    The Event member contains a MOUSE_EVENT_RECORD structure with information about a mouse movement or button press event.
    WINDOW_BUFFER_SIZE_EVENT
    The Event member contains a WINDOW_BUFFER_SIZE_RECORD structure with information about the new size of the screen buffer.
    MENU_EVENT
    The Event member contains a MENU_EVENT_RECORD structure. These events are used internally and should be ignored.
    FOCUS_EVENT
    The Event member contains a FOCUS_EVENT_RECORD structure. These events are used internally and should be ignored.

    Event
    Contains a KEY_EVENT_RECORD, MOUSE_EVENT_RECORD, WINDOW_BUFFER_SIZE_RECORD, MENU_EVENT_RECORD, or FOCUS_EVENT_RECORD structure, depending on the event type specified by the EventType member.

    Da siehst du wieder - falls es ein KEY_RECORD war - du eine Struktur vom Typ KEY_EVENT_RECORD bekommst:

    KEY_EVENT_RECORD
    The KEY_EVENT_RECORD structure is used to report keyboard input events in a console INPUT_RECORD structure.

    typedef struct _KEY_EVENT_RECORD { // ker
    BOOL bKeyDown;
    WORD wRepeatCount;
    WORD wVirtualKeyCode;
    WORD wVirtualScanCode;
    union {
    WCHAR UnicodeChar;
    CHAR AsciiChar;
    } uChar;
    DWORD dwControlKeyState;
    } KEY_EVENT_RECORD;

    Members
    bKeyDown
    Specifies TRUE if the key is being pressed, FALSE if the key is being released.
    wRepeatCount
    Specifies a count indicating that a key is being held down. For example, when a key is held down, you might get five events with this member equal to 1, one event with this member equal to 5, or multiple events with this member greater than or equal to 1.
    wVirtualKeyCode
    Specifies the virtual-key code that identifies the given key in a device-independent manner.
    wVirtualScanCode
    Specifies the virtual scan code of the given key that represents the device-dependent value generated by the keyboard hardware.
    uChar
    Specifies the translated Unicode or ASCII character, depending on whether the wide-character (Unicode) or ANSI version of the ReadConsoleInput function was used.
    dwControlKeyState
    Indicates the state of the control keys. This member can be a combination of the following values: Value Meaning
    CAPSLOCK_ON The caps lock light is on.
    ENHANCED_KEY The key is enhanced.
    LEFT_ALT_PRESSED The left alt key is pressed.
    LEFT_CTRL_PRESSED The left ctrl key is pressed.
    NUMLOCK_ON The num lock light is on.
    RIGHT_ALT_PRESSED The right alt key is pressed.
    RIGHT_CTRL_PRESSED The right ctrl key is pressed.
    SCROLLLOCK_ON The scroll lock light is on.
    SHIFT_PRESSED The shift key is pressed.

    Remarks
    Enhanced keys for the IBM® 101- and 102-key keyboards are the ins, del, home, end, page up, page down, and direction keys in the clusters to the left of the keypad; and the divide (/) and enter keys in the keypad.

    Keyboard input events are generated when any key, including control keys, is pressed or released. However, the alt key when pressed and released without combining with another character, has special meaning to the system and is not passed through to the application. Also, the ctrl+c key combination is not passed through if the input handle is in processed mode (ENABLE_PROCESSED_INPUT).

    Für dich wichtig ist wohl wRepeatCount!

    Also zuerst mit kbhit() prüfen ob eine Taste gedrückt wurde - wenn nicht "Taste wurde nicht gedrückt." Falls ja über ReadConsoleInput() auslesen, auf KEY_EVENT prüfen - falls es kein KE ist weiter abrufen - irgendwas mit key muss ja da sein ;). Dann wRepeatCount prüfen und voila du weist wie zum wievielten Mal die Taste bereits hintereinander ein Event auslöst -> wie lange sie bereits gedrückt wurde.

    Sorry, dass ich dir im Moment nicht mehr erklären kann. Aber ich habe wenig Zeit!

    MfG SideWinder



  • Wie könnte man die Tastenwiederholungsrate verändern???



  • uff, warum ist das alles immer so schwer 🙄
    aber jetzt klappt es 🙂 , also noch ma n dickes gracias an sidewinder!
    MfG Kenny


Anmelden zum Antworten