출처 : http://blog.naver.com/silver6688?Redirect=Log&logNo=60051209034

GetAsyncKeyState와 GetKeyState의 차이점
GetAsyncKeyState와 GetKeyState는 둘 다 키의 상태값을 알아내는 함수이다.
하지만 이 둘 사이에는 차이점이 있는데 다음과 같은 것들이다.

GetAsyncKeyState는 "키가 눌렸는가?"와 "언제부터 눌렸는가?"를 알아낼 때 사용한다.
키가 눌렸을 때 GetAsyncKeyState는 0x8000 bit가 1이된다.
그리고, 이전에 GetAsyncKeyState가 호출되었을 때부터 이번에 GetAsyncKeyState가 호출될 때까지
중간에 끊기지 않고 계속 눌려있는 상태라면 0x0001 bit는 0이 되고, 그렇지 않은 경우는 1이 된다.

1) CTRL 키가 눌린 상태이다.
2) GetAsyncKeyState(VK_CONTROL)를 호출하면 0x8001을 리턴한다.
3) GetAsycnKeyState(VK_CONTROL)을 한번 더 호출하면 0x8000을 리턴한다.

1) CTRL 키가 눌린 상태이다.
2) GetAsyncKeyState(VK_CONTROL)를 호출하면 0x8001을 리턴한다.
3) CTRL 키를 뗬다가 다시 눌렸다.
4) GetAsycnKeyState(VK_CONTROL)을 한번 더 호출해도 0x8001을 리턴한다.

키가 눌리지 않았을 때, GetAsyncKeyState는 항상 0x0000을 리턴한다.

SHORT GetKeyState(      
    int nVirtKey
);

Return Value

The return value specifies the status of the specified virtual key, as follows:

  • If the high-order bit is 1, the key is down; otherwise, it is up.
  • If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on.
  • The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on
  • when the key is toggled, and off when the key is untoggled.

GetKeyState는 "키가 눌렸는가?"와 "키의 토글상태가 무엇인가?"를 알아낼 때 사용한다.
키의 토글 상태란 Caps Lock, Num Lock의 키가 한번 누르면 불이 켜지고
다시 한번 누르면 불이 꺼지는 것을 생각하면 이해가 빠를것 같다.
키보드 상에는 위에서 말한 키만 불이 켜졌다 꺼졌다하면서 토글상태를 알려주고 있지만
다른 키들도 토글 상태를 갖고 있으며 단지 우리 눈에 보이지 않을 뿐이다.
이 토글 상태를 GetKeyState 함수로 알아낼 수 있다.

GetKeyState의 리턴값은 SHORT가 아닌 CHAR로 생각된다.
리턴값을 살펴보면 0xffffff81, 0xffffff80, 0x00000001, 0x00000000이
되는 것을 볼 수 있기 때문이다.
참고로 같은 SHORT형을 리턴하는 GetAsyncKeyState의 리턴값은 다음과 같다.
0xffff8001, 0xffff8000, 0x00000000 셋 중 하나

** MSDN에는 현재 하드웨어(키보드)의 상태값을 알아내길 원한다면
GetAsyncKeyState를 사용하라고 나와있다. GetKeyState는
메시지큐에 저장된 메시지에 따라 값이 변하기 때문이다.
메시지큐에 처리되지 않은 CTRL키가 눌렸다는 메시지가 쌓여있을 때,
사용자가 CTRL키를 더이상 누르지 않고 있다면.
GetAsyncKeyState는 "키가 눌리지 않았음"을,
GetKeyState는 "키가 눌렸음"을 리턴할 것이다.
////////////////////////////////////////////////////////////////////
ex)
 
if( ( ::GetKeyState( VK_MENU ) & 0x8000 ) > 0 )
{
     ::MessageBox( NULL, _T("ALT 키다 눌렷다~"), NULL, NULL );
}

////////////////////////////////////////////////////////////////////////////////////

GetAsyncKeyState는 윈도우즈 메시지 루프를 사용하지 않는 곳 (예를 들면 쓰레드, PeekMessage의 Idle 처리 등)에서 사용하죠




AND