C, C++, MFC
[WinApi] 조이스틱 사용 방법
수동애비
2023. 4. 26. 15:53
반응형
조이스틱 탐지
JOYINFO joyinfo;
UINT wNumDevs;
BOOL bAttached;
// 연결된 조이스틱 장치의 개수 확인
if ((wNumDevs = joyGetNumDevs()) == 0) {
TRACE("No device\n");
return;
}
// 조이스틱이 연결 시 순서대로 JOYSTICKID1, JOYSTICKID2 조이스틱 ID 를 가진다.
// JOYSTICKID1 의 조이스틱 현재 정보를 요청하여 에러가 없다면 연결된 것으로 판별.
bAttached = joyGetPos(JOYSTICKID1, &joyinfo) == JOYERR_NOERROR;
if (bAttached == FALSE) {
TRACE("Joystick not plugged\n");
return;
}
JOYCAPS joyCaps;
ZeroMemory(&joyCaps, sizeof(JOYCAPS));
// 연결된 상태라면 조이스틱 지원범위를 쿼리하여 정보를 획득한다.
if (joyGetDevCaps(JOYSTICKID1, &joyCaps, sizeof(JOYCAPS)) == JOYERR_NOERROR) {
TRACE("ManufactureID=%04X, ProductID=%04X\n", joyCaps.wMid, joyCaps.wPid);
TRACE(_T("ProductName=%s\n"), joyCaps.szPname);
TRACE(_T("Axes Count=%d\n"), joyCaps.wMaxAxes);
TRACE(_T("Xmin=%d, Xmax=%d\n"), joyCaps.wXmin, joyCaps.wXmax);
TRACE(_T("Ymin=%d, Ymax=%d\n"), joyCaps.wYmin, joyCaps.wYmax);
TRACE(_T("Zmin=%d, Zmax=%d\n"), joyCaps.wZmin, joyCaps.wZmax);
TRACE(_T("Button Count=%d\n"), joyCaps.wNumButtons);
}
조이스틱 조작 정보 획득
// JOYSTICKID1 ID 를 가지는 조이스틱이 연결된 상태라면 joyGetPos 를 통해 정보를 획득
JOYINFO joyinfo;
UINT x, y, z; // xyz 축 정보
UINT btn;
if (joyGetPos(JOYSTICKID1, &joyinfo) == JOYERR_NOERROR) {
x = joyinfo.wXpos;
y = joyinfo.wYpos;
z = joyinfo.wZpos;
btn = joyinfo.wButtons;
// btn 에서 JOY_BUTTON1 ~ JOY_BUTTON32 버튼을 마스크 비트 연산으로 체크하여 눌려진 상태를 확인한다.
if (btn & JOY_BUTTON1) {
// 버튼1 클릭 처리
}
}
그밖에 다음 Api 를 통해 필요한 동작을 구현할 수 있으며 api 사용법이 간단하기 때문에 아래 ms 사이트에서 api 를 참고하면 된다.
https://learn.microsoft.com/en-us/windows/win32/api/joystickapi/nf-joystickapi-joygetpos
joyGetDevCaps - 조이스틱 장치의 기능 쿼리 (지원 축, 버튼 수, 입력값 min~max 등 정보 획득 가능)
joySetCapture - 윈도우 메세지로 조이스틱 이동 및 버튼 상태를 받을 수 있도록 윈도우 핸들을 등록.
joyReleaseCapture - joySetCapture 한 윈도우 핸들 등록 해제
구현 방향은 별도의 스레드를 생성하여 joyGetPos() 를 주기적으로 호출하는 방식 또는 joySetCapture 를 이용하여 윈도우 메세지로 받는 방법 중 선택하여 구현하면 된다.