GetAsyncKeyState
SHORT GetAsyncKeyState(int vKey)
반환값은 SHORT형이고, 첫번째 인수로는 가상 키코드가 오며, 우리가 만약 VK_UP을 넘겨주면, 방향키 중 위를 가르키는 키가 눌려있나 눌려있지 않나 확인할 수 있다. (키가 눌려진 상태에서는 최상위 비트(0x8000)이 1이 되며, 처음 입력되었을 때는 0x8001 비트가 1이 된다.)
반환값은 아래와같이 4가지로 나뉜다.
이전에 누른 적이 없고 호출 시점에서 눌린 상태, 즉 키가 눌려진 시점에서 0x8000을 반환한다. 만약 이전에도 누른 적이 있고 호출 시점에서도 눌렸으면 0x8001을 반환한다. 이전에 키를 눌렀으면 0x0001을 반환하고, 눌리지 않았다면 0x0000을 반환한다.
GetAsyncKeyState(VK_UP) & 0x8000 코드의 의미) 0x8000과 GetAsyncKeyState 반환값을 AND 연산하는 이유는 정확한 시점에서 키의 상태를 확인하기 위함이다. 만약에 키를 눌러 GetAsyncKeyState 함수가 0x8000을 반환한다면 이를 0x8000으로 AND 연산하여 키가 눌렸을때는 0x8000이 나온다. 그러나 눌려진 적이 있으면 GetAsyncKeyState 함수는 0x0001을 반환한다. 0x0001에다 0x8000을 AND 연산하게되면 0이 나오게 된다. (만약에 AND 연산하지 않았을 경우에는 눌러진 적이 있는 상태도 참이 되어 동작을 수행할 것이다.)
#include <stdio.h>
#include <windows.h>
#include <conio.h>
void GotoXY(int x, int y)
{
COORD cur;
cur.X = x, cur.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cur);
}
int main()
{
int x = 0, y = 0;
while (1)
{
GotoXY(x, y);
putch('@');
if (GetAsyncKeyState(VK_UP) & 0x8000)
y--;
if (GetAsyncKeyState(VK_DOWN) & 0x8000)
y++;
if (GetAsyncKeyState(VK_LEFT) & 0x8000)
x--;
if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
x++;
Sleep(50);
}
}
GetKeyState
SHORT GetKeyState(int nVirtKey)
GetKeyState도 반환되는 값은 SHORT형이며, 첫번째 인수도 가상 키코드가 온다. GetKeyState는 메세지 큐에 저장된 메시지에 따라 반환되는 값이 다르다. 만약에 우리가 A 키를 눌렀다는 메세지가 메세지 큐에 남아 처리되지 않을때 있을때, 키가 눌렸다고 출력될 것이다. 반대로 GetAsyncKeyState는 메세지 큐와 상관없이 입력되는 순간 즉각적으로 읽어들여 동작한다. GetKeyState 함수는 해당 키가 눌렸으면 음수값(0xffffff80, 0xffffff81)을 반환하고, 아닐 경우에는 0을 반환한다. 이것 역시 이전에 누른적이 있고, 호출 시점에서는 누르지 않았다면 계속 1로 남는다.
#include <stdio.h>
#include <windows.h>
#include <conio.h>
void GotoXY(int x, int y)
{
COORD cur;
cur.X = x, cur.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cur);
}
int main()
{
int x = 0, y = 0;
while (1)
{
GotoXY(x, y);
putch('@');
if (GetKeyState(VK_UP) & 0x8000)
y--;
if (GetKeyState(VK_DOWN) & 0x8000)
y++;
if (GetKeyState(VK_LEFT) & 0x8000)
x--;
if (GetKeyState(VK_RIGHT) & 0x8000)
x++;
Sleep(50);
}
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] 구조체 바이트 패딩 규칙 코드 (structure byte padding or align rule) (0) | 2024.04.24 |
---|---|
C++ 23 추가된 주요 기능들 (0) | 2024.02.27 |
[C++] inline (인라인) 함수란 (0) | 2023.12.21 |
[C++] 입출력 개요 (0) | 2023.12.21 |
[C++] Iterator (반복자) (0) | 2023.12.19 |