2012-09-30 3 views
1

사용자 키 누르기를 잡기 위해 간단한 루프를 사용하고 있습니다. 사용자가 특정 키를 누를 때 무한정 반복 것 같은키 누르기 잡기 C++

while (1) 
{ 
    for(i = 8; i <= 190; i++) 
    { 
     if (GetAsyncKeyState(i) == -32767){ 
     //Do stuff 
     } 
    } 
} 

그러나 분명히, 어떤을 '물건을 할'하고 내가 C에 새로 온 사람으로서 ++는 간단한 입력 좋지 않아 100 %의 CPU를 복용.

내가 뭘 잘못하고 있니? Sleep() 함수를 사용해 보았습니다. (for 루프에 넣으면 키를 누를 수 있습니다. 'while 루프'에 넣으면 CPU가 전혀 낮아지지 않습니다.)

나는 그것이 같은 키 누르기를 잡도록 만들 수 있지만 거의 CPU를 사용하지 마십시오. 트릭을 놓치고 있습니까? 나는 대부분의 프로그램이 keypresses를 잡을 것이고 당신은 100 %를 사용하는 모든 것을 보지 못한다고 확신한다!

고맙습니다.

+0

선형 알고리즘을 사용하여 이것을 수행 할 수 없습니다 ... 프로그램에 리스너를 추가해야합니다. 구글. –

+0

후크를 사용하십시오. 'GetMessage'는 키 이벤트가 발생할 때까지 유휴 상태가됩니다. 더러운 해결책을 위해'Sleep (10); '이나 어떤 것을 루프에 추가하십시오. – chris

+0

이전에는'RegisterHotkey'와'UnregisterHotkey'의 조합을 사용했습니다. 그렇지만 창에 포커스가있을 때 키 누르기 만 감지하기를 원했기 때문에 포커스가 사라지면 'UnregisterHotkey'를 호출하고 포커스가 다시 들어 왔을 때 다시 등록했습니다. 어쩌면이 기능들이 당신을 도울 것입니다. 창이 초점이 맞지 않을 때 바로 가기 키를 등록 취소하지 않으면 다른 응용 프로그램 바로 가기 키가 엉망이 될 수 있습니다. – Marlon

답변

0

당신이 도움이 될

while (!kbhit()); 

사용할 수 있습니다.

+0

내 컴파일러는 컴파일러가 해당 명령을 사용할 kbhit (DevC++)를 인식하지 못합니까? –

+0

'conio.h'를 포함 시켰습니까? –

+0

지금도 고맙습니다. 그래도 여전히 매우 높은 CPU 임에도 불구하고 다른 의견과 마찬가지로 후크 나 리스너를 사용해 보겠습니다. 감사. –

2

GetAsyncKeyState()를 예제 코드와 함께 사용하는 방법을 설명하는 다음 링크를 확인하십시오. GetAsyncKeyState() 함수는 당신이 뭘 하려는지 적합하지 않습니다 : http://www.mpgh.net/forum/31-c-c-programming/120656-proper-use-getasynckeystate.html

희망이 링크는 문제

편집을 해결하는 데 도움이 될 수 있습니다.

단순히 키보드의 현재 키 - 현재 - 나노초 위치를 확인하는 것입니다. 그렇게하는 것은 거의 항상 부정확합니다.

대신 적절한 입력 기능을 사용하여 콘솔 입력을 읽으십시오. 아래 샘플 코드를 찾으십시오.

2

무한 루프를 작업자 스레드에 넣고 반복 할 때마다 적절한 간격으로 잠자기 상태로 만듭니다. C++ 11은 이것을 매우 쉽게 만듭니다.

#include <thread> 
#include <chrono> 

std::chrono::milliseconds THREAD_WAIT = 50; 

int keypress = -1; 

void GetKeyPress() 
{ 
    while (1) 
    { 
     for(i = 8; i <= 190; i++) 
     { 
      int k = GetAsyncKeyState(i); 
      if (/*whatever condition needs to be satisfied*/) 
       keypress = k; 
     } 
     if (keypress != -1) break; //Use this only if you have td.join() below 
     std::this_thread::sleep_for(THREAD_WAIT); 
    } 
} 

int main(void) 
{ 
    ... 

    std::thread td(GetKeyPress); 
    td.join(); //If you want to block until the user presses a key, otherwise remove. 

    //If no join(), do the rest of your program, checking in on keypress when need be 

    return 0; 
}