kbhit() mit WinAPI



  • Ich würde gerne kbhit() mit der WinAPI "nachbasteln", doch funktioniert es nicht so recht, weiss jemand gerade wieso?

    bool kbhit(void)
    {
    	INPUT_RECORD buf;
    	DWORD n;
    	PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&buf,1,&n);
    	if(buf.Event.KeyEvent.bKeyDown && buf.EventType&KEY_EVENT)
    		return true;
    	else
    		return false;
    }
    


  • geht das nicht mit GetAsyncKey() oder sowas ähnlichem?



  • Es können im Puffer auch andere und nicht nur Keyboard-Events stehen. Das ganze sieht in der VC-Implementierung so aus (Copyright Microsoft & P.J. Plauger):

    int __cdecl _kbhit_nolock (
    
            void
            )
    {
            DWORD NumPending;
            DWORD NumPeeked;
            int ret = FALSE;
            PINPUT_RECORD pIRBuf=NULL;
    
            /*
             * if a character has been pushed back, return TRUE
             */
            if ( chbuf != -1 )
                return TRUE;
    
            /*
             * _coninpfh, the handle to the console input, is created the first
             * time that either _getch() or _cgets() or _kbhit() is called.
             */
    
            if ( _coninpfh == -2 )
                __initconin();
    
            /*
             * Peek all pending console events
             */
            if ( (_coninpfh == -1) ||
    
                 !GetNumberOfConsoleInputEvents((HANDLE)_coninpfh, &NumPending) ||
    
                 (NumPending == 0))
            {
                return FALSE;
            }
    
            pIRBuf=(PINPUT_RECORD)_calloca(NumPending, sizeof(INPUT_RECORD));
            if ( pIRBuf == NULL )
            {
                return FALSE;
            }
    
            if ( PeekConsoleInput( (HANDLE)_coninpfh,
                                   pIRBuf,
                                   NumPending,
                                   &NumPeeked ) &&
    
                 (NumPeeked != 0L) &&
    
                 (NumPeeked <= NumPending) )
            {
    
                /*
                 * Scan all of the peeked events to determine if any is a key event
                 * which should be recognized.
                 */
                PINPUT_RECORD pIR;
                for ( pIR = pIRBuf ; NumPeeked > 0 ; NumPeeked--, pIR++ ) {
    
                    if ( (pIR->EventType == KEY_EVENT) &&
    
                         (pIR->Event.KeyEvent.bKeyDown) &&
    
                         ( pIR->Event.KeyEvent.uChar.AsciiChar ||
                           _getextendedkeycode( &(pIR->Event.KeyEvent) ) ) )
                    {
                        /*
                         * Key event corresponding to an ASCII character or an
                         * extended code. In either case, success!
                         */
                        ret = TRUE;
                    }
                }
            }
    
            _freea( pIRBuf );
    
            return ret;
    }
    

    MfG SideWinder


Anmelden zum Antworten