mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 02:25:17 +00:00
99 lines
2.3 KiB
C
99 lines
2.3 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS system libraries
|
|
* FILE: lib/sdk/crt/conio/kbhit.c
|
|
* PURPOSE: Checks for keyboard hits
|
|
* PROGRAMERS: Ariadne, Russell
|
|
* UPDATE HISTORY:
|
|
* 28/12/98: Created
|
|
* 27/9/08: An almost 100% working version of _kbhit()
|
|
*/
|
|
|
|
#include <precomp.h>
|
|
|
|
static CRITICAL_SECTION CriticalSection;
|
|
volatile BOOL CriticalSectionInitialized=FALSE;
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
|
|
int _kbhit(void)
|
|
{
|
|
PINPUT_RECORD InputRecord = NULL;
|
|
DWORD NumberRead = 0;
|
|
DWORD EventsRead = 0;
|
|
DWORD RecordIndex = 0;
|
|
DWORD BufferIndex = 0;
|
|
HANDLE StdInputHandle = 0;
|
|
DWORD ConsoleInputMode = 0;
|
|
|
|
/* Attempt some thread safety */
|
|
if (!CriticalSectionInitialized)
|
|
{
|
|
InitializeCriticalSectionAndSpinCount(&CriticalSection, 0x80000400);
|
|
CriticalSectionInitialized = TRUE;
|
|
}
|
|
|
|
EnterCriticalSection(&CriticalSection);
|
|
|
|
if (char_avail)
|
|
{
|
|
LeaveCriticalSection(&CriticalSection);
|
|
return 1;
|
|
}
|
|
|
|
StdInputHandle = GetStdHandle(STD_INPUT_HANDLE);
|
|
|
|
/* Turn off processed input so we get key modifiers as well */
|
|
GetConsoleMode(StdInputHandle, &ConsoleInputMode);
|
|
|
|
SetConsoleMode(StdInputHandle, ConsoleInputMode & ~ENABLE_PROCESSED_INPUT);
|
|
|
|
/* Start the process */
|
|
if (!GetNumberOfConsoleInputEvents(StdInputHandle, &EventsRead))
|
|
{
|
|
LeaveCriticalSection(&CriticalSection);
|
|
return 0;
|
|
}
|
|
|
|
if (!EventsRead)
|
|
{
|
|
LeaveCriticalSection(&CriticalSection);
|
|
return 0;
|
|
}
|
|
|
|
if (!(InputRecord = (PINPUT_RECORD)malloc(EventsRead * sizeof(INPUT_RECORD))))
|
|
{
|
|
LeaveCriticalSection(&CriticalSection);
|
|
return 0;
|
|
}
|
|
|
|
if (!PeekConsoleInput(StdInputHandle, InputRecord, EventsRead, &NumberRead))
|
|
{
|
|
free(InputRecord);
|
|
LeaveCriticalSection(&CriticalSection);
|
|
return 0;
|
|
}
|
|
|
|
for (RecordIndex = 0; RecordIndex < NumberRead; RecordIndex++)
|
|
{
|
|
if (InputRecord[RecordIndex].EventType == KEY_EVENT &&
|
|
InputRecord[RecordIndex].Event.KeyEvent.bKeyDown)
|
|
{
|
|
BufferIndex = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
free(InputRecord);
|
|
|
|
/* Restore console input mode */
|
|
SetConsoleMode(StdInputHandle, ConsoleInputMode);
|
|
|
|
LeaveCriticalSection(&CriticalSection);
|
|
|
|
return BufferIndex;
|
|
}
|
|
|
|
|