상세 컨텐츠

본문 제목

세 종류의 KeyHit 함수

프로그래밍/C & C++

by 앙마^^* 2007. 11. 19. 04:20

본문

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;
}

관련글 더보기