개발은 하는건가..

[WinApi] 조이스틱 사용 방법 본문

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  를 이용하여 윈도우 메세지로 받는 방법 중 선택하여 구현하면 된다.

 

Comments