본문 바로가기

자료

[C#/VB.NET] WIN 32 API GetKeyState 함수

728x90

[C#/VB.NET] [C#/VB.NET] WIN 32 API GetKeyState 함수


GetKeyState 함수

 

현재 키의 토글 상태를 알아오는 함수입니다.


이 함수는 키가 눌려졌을 때(down)나 떨어졌을 때(up) 호출됩니다.

 

GetAsyncKeyState 함수와 같은 역할을 하는 것처럼 보이나 써보면 다르다는 것을 알 수 있습니다.

 

이 함수에서는 Caps Lock이나 Num Lock처럼 해당 키의 토글 상태를 반환합니다.

한번 누르면 해당 키의 토글이 설정되고 두번 누르면 토글이 해제됩니다.

 

The key status returned from this function changes as a thread reads key messages from its message queue.

 

GetKeyState 함수는 해당 프로그램의 스레드 입력 메시지 큐에서 얻어옵니다.

반면에 GetAsyncKeyState 함수는 하드웨어와 관련된 인터럽트 레벨의 상태값에서 얻어옵니다.

 

 

 

함수 원형

 

























SHORT GetKeyState(


    int nVirtKey);

 

 

 

인수

 





 nVirtKey
 가상키 코드(Virtual-Key Codes)입니다.
 여기에 확인하고자 하는 키를 입력합니다.
아래 표는 가상키 코드입니다.









 



리턴 값

 

 값  설명
 0x0000  이전에 누른 적이 없고 호출 시점에도 눌려있지 않은 상태
 0x0001  이전에 누른 적이 있고 호출 시점에는 눌려있지 않은 상태
 0x8000  이전에 누른 적이 없고 호출 시점에는 눌려있는 상태
 0x8001  이전에 누른 적이 있고 호출 시점에도 눌려있는 상태

 

 

 

요구 사항

 

 운영체제  Windows 2000 이상
 헤더  Winuser.h (include Windows.h)
 라이브러리  User32.lib
 DLL  User32.dll

 

 

 

예제

 

이 예제는 WinMain의 기본 구성에서 WndProc 부분에 그대로 복사하시면 됩니다.

 

첨부파일을 참고해주세요.

 

























DWORD dwLine;






LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{


    HDC hdc;




    switch (iMessage)


    {


    case WM_CREATE:


        dwLine = 0;


        SetTimer(hWnd, 1, 0, NULL); // 현재 상황을 알기 위한 타이머 설정


        return 0;




    case WM_TIMER:


        hdc = GetDC(hWnd);




        switch (wParam)


        {


        case 1:


            if (GetKeyState(VK_SPACE)) // 현재 키의 토글 상태를 알 수 있다


            {


                dwLine += 15;


                TextOut(hdc, 10, dwLine, TEXT("GetKeyState"), 11);


            }




            if (GetAsyncKeyState(VK_SPACE)) // 현재 키의 눌림을 알 수 있다


            {


                dwLine += 15;


                TextOut(hdc, 410, dwLine, TEXT("GetAsyncKeyState"), 16);


            }


        }




        ReleaseDC(hWnd, hdc);


        return 0;




    case WM_LBUTTONDOWN: // 화면 지우기


        dwLine = 0;


        InvalidateRect(hWnd, NULL, TRUE);


        return 0;




    case WM_DESTROY:


        PostQuitMessage(0);


        return 0;


    }


    // WinProc에서 처리하지 않는 나머지 메시지를 윈도우 기본으로 처리하도록 전달


    return (DefWindowProc(hWnd, iMessage, wParam, lParam));


}

 



결과

 

GetAsyncKeyState 함수가 호출된 부분은 스페이스 바를 누른 시점입니다.

 

총 2번의 스페이스 바를 눌렀으며 그 사이는 누르지 않은 상태입니다.

 

스페이스 바를 한번 누르고 난 다음에는 누르지 않았음에도 GetKeyState 함수가 값을 반환하는 것을 알 수 있습니다.

 

여기서 한번을 누름으로써 스페이스 바가 토글 상태가 되어 GetKeyState 함수에서 인식된 것입니다.

 

그리고 두번째로 눌렀을 때에는 누른 상태이므로 GetAsyncKeyState 함수와 같이 호출되고 토글이 해제되었습니다.

 

 

 

 

 

출처: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx

728x90