GetAsyncKeyState 0x8001에관해서.

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

GetAsyncKeyState 0x8001에관해서.

Post by 비회원 »

visual studio 2005에서..

왼쪽 화살표 키를 누르면 처리를 하는 루틴이 있습니다.

그런대 제가 원하는건.. 키를 꾹 누르고 있다고 해도 ...

단한번 처리하는 루틴입니다.

그래서

GetAsyncKeyState는 처음 키가 눌려졌을때 단한번
0x8001의 bit가 1이되고 , 그후 키가 계속눌려져있을경우 0x8000이 됩니다.
그러니까

if((GetAsyncKeyState(VK_LEFT) & 0x8001) == 0x8001)
{
//루틴 처리
}

이렇게 처리를 하게끔 만들었는대..

이상하게 계속 루틴이 처리됩니다

그래서 디버깅을 위해서

static int count = 0;
unsigned short test = GetAsyncKeyState(VK_LEFT) & 0x8001;

if( test == 0x8001 )
{
if( count > 0 ) // 두번째 확인을 위해서...
{
.... //여기 브레이크 포인트를 찍는다.

}

count++;

}

이렇게 해서 두번째 들어오는 값을 확인할수 있게 만들었습니다.

확인을 해보니까 처음에 나오는 test값은 32769 즉 0x8001입니다.

그리고 if문안으로 들어갈 경우는 다시 땟다가 다시 왼쪽키를 눌렀을경우라고 생각했는대

꾹 누르고 있었을때 if문안으로 들어갔습니다.

두번째 꾹눌렀을때 값은 원래 제 생각대로라면 32768 이 나와야되는대.

이것도 32769가 나오더라구요..

msdn에서 잘못적어놓은건가??;; 혼자 골똘히 생각하고있습니다.

왜그런거죠??
jaemok
Posts: 1
Joined: 2009-09-11 16:13

least significant bit 은 신뢰하지 말라고 msdn에도 나와있네요...

Post by jaemok »

Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications (which are non-preemptive) and should not be relied upon.

다른 윈도우 애플리케이션에서도 GetAsyncKeyState 를 부를 수 있기 때문에 lsb 는 믿으면 안된다고 하네요
Locked