[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
'자료' 카테고리의 다른 글
일반 PC도 삼성 Quick Share 적용 방법 공유/삼성 퀵쉐어 사용법 (0) | 2021.12.26 |
---|---|
오토캐드 AutoCAD 2022 키젠 설치법 AutoCAD 2019 키젠 초보자 설치법 (2) | 2021.10.02 |
[OpenCvSharp] Mat to Bitmap (0) | 2021.09.25 |
[C#/VB.NET] 숫자,한글,영어 OCR 프로젝트 (0) | 2021.09.25 |
한국주소 영문변환 2가지 방법 (0) | 2021.09.23 |