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