GetKeyState & GetAsyncKeyState
SHORT GetKeyState(int nVirtKey);
SHORT GetAsyncKeyState(int nVirtKey);
두 함수 모두 조사하고 싶은 가상 키 코드를 인수로 전달 받는다. 일반 키일 경우 눌러졌으면 최상위 비트(MSB)가 1로 설정되고 그렇지 않으면
0으로 설정된다. Caps Lock같은 토글키는 켜져 있을 경우 최하위 비트 (LSB)가 1로 설정되고 그렇지 않으면 0으로 설정된다. 어떤 키가 현재 눌러져 있는가 아닌가를 알고 싶으면 이 함수의 리턴 값을 0x8000과 &연산하여 결과가 0인가 아닌가를 살펴보면 된다. 리턴 값이 부호가 있는 값이므로 음수이면 키가 눌러진 것으로 판단해도 된다.
두 함수는 메세지가 발생되었을 때의 키 상태를 조사하는가 아니면 현재 키 상태를 조사하는가가 다르다. 보통의 경우 두 함수가 조사하는 값이 동일하지만 메세지가 즉시 처리되지 못했을 경우 차이가 발생할 수 있다.
GetKeyState()는 메세지가 발생했을 때 상황을 조사하고 GetAsyncKeyState()는 이 메세지가 처리될 때의 상황을 조사한다. 그러므로 GetKeyState()는 메세지 큐에 키를 눌렀다는 메세지가 남아있을 때, 눌렀다고 반환하고 GetAsyncKeyState()는 메세지 큐와는 상관 없이 이 함수가 호출되는 즉시 키를 체크하여 동작합니다.
출처 : 윈도우즈 정복 API 1권
추가적인 차이점을 말하자면 GetkeyState()의 경우 토글키나 Ctrl, alt, shift 등의 키를 들 수 있다.
이 키들을 누르고 있는 상태에서 GetKeyState()를 호출한다면 매번 눌러져있다고 해줄 것이다. GetAsyncKeyState()의 경우
자신이 호출될 때 체크한 키의 경우 다음번 다시 호출될때까지 계속 눌러져있는 상태라면 눌리지 않았다고 체크한다.
'Program Languege > WinAPI' 카테고리의 다른 글
PeekMessage (0) | 2014.04.10 |
---|---|
GDI 오브젝트 (0) | 2014.04.02 |
HINSTANCE (0) | 2014.03.25 |
HANDLE (0) | 2014.03.25 |
API (0) | 2014.03.25 |