KeyHit() 함수..
Input 버퍼에 키보드 관련 내용이 있으면 true를 return 하고..
아니면 false 를 return 하는 함수 이다.
Google 검색을 통해서..
처음 찾은 소스..
bool KeyHit()
{
DWORD NumEvents=0, NumEventsRead=0;
INPUT_RECORD *InputRecord;
DWORD i;
int tt =GetNumberOfConsoleInputEvents(StdIn, &NumEvents);
InputRecord = (INPUT_RECORD *)malloc(sizeof(INPUT_RECORD)*NumEvents);
PeekConsoleInput(StdIn, InputRecord, NumEvents, &NumEventsRead);
for(i = 0; i < NumEventsRead; i++)
{
if(InputRecord[i].EventType & KEY_EVENT &&
InputRecord[i].Event.KeyEvent.bKeyDown)
{
if(InputRecord[i].Event.KeyEvent.wVirtualKeyCode != VK_CONTROL &&
InputRecord[i].Event.KeyEvent.wVirtualKeyCode != VK_MENU &&
InputRecord[i].Event.KeyEvent.wVirtualKeyCode != VK_SHIFT)
{
free(InputRecord);
return true;
}
}
}
free(InputRecord);
return false;
}
이 소스는 인풋 버퍼에 있는것들 모두를 가져와서,. 모두 확인후..
하나라도 키보드 키가 있으면. true를 리턴한다...
But... Scanf 등과 같이 문자열 관리하는 함수를 프로그램 내에서 사용하게되면..
GetNumberOfConsoleInputEvents 이 함수가 제대로 동작을 안해버린다!!
그래서.. 삽질끝에 발견한 소스..
하나씩 읽어와서.. 해결해 준다.. ㅋㅋㅋㅋ
bool KeyHit()
{
INPUT_RECORD str;
DWORD num = 0;
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &str, 1, &num);
if(num != 0 && str.Event.KeyEvent.bKeyDown)
{
if(str.Event.KeyEvent.wVirtualKeyCode != VK_CONTROL &&
str.Event.KeyEvent.wVirtualKeyCode != VK_MENU &&
str.Event.KeyEvent.wVirtualKeyCode != VK_SHIFT)
{
return true;
}
num = 0;
}
return false;
}
하지만.. 이 소스는.. 하나의 Input만 관리함으로 문제가 발생!!
100개의 인풋을 동시 사용할수 잇는 소스로 수정!!!
bool KeyHit()
{
INPUT_RECORD* str = new INPUT_RECORD[100];
DWORD num = 0;
PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), str, 100, &num);
for(int i=0; i<num; i++)
{
if(str[i].EventType & KEY_EVENT &&
str[i].Event.KeyEvent.bKeyDown)
{
if(str[i].Event.KeyEvent.wVirtualKeyCode != VK_CONTROL &&
str[i].Event.KeyEvent.wVirtualKeyCode != VK_MENU &&
str[i].Event.KeyEvent.wVirtualKeyCode != VK_SHIFT)
{
delete str;
return true;
}
}
}
delete str;
return false;
}