■ゲームパッド(ジョイパッドと言うらしい)を使ってみる

ジョイパッドの一つ目(0番)に接続して状態を読み取ります。
ボタンの状態はJOYINFOEX構造体に入って返ってきます。
矢印キーはdwXposとdwYposの値が変化します、中央値は0x7fffでキーが押されるとそれぞれの値が増減します。
アナログモードだとスティックの変化に対してdwXposとdwYposの値が変化します
アナログモードで無いと値が0と0x7fffと0xffffを取りました。
ただ、ジョイパッドにより違う値をとるときがあるみたいです
他のジョイパッドを試した所、中央値が0x7effでした。

ELECOM JC-U3412S 中央値 0x7fff
RIX RX-JPAD-RD 中央値 0x7eff

スティックが2個あるジョイパッドの場合は2個目の矢印キーはdwZposとdwRposに割り当てられてました。
各種ボタンはdwButtonsの値から読み取れます、各ビットに割り振られてます。
#pragma comment(lib, "winmm.lib")

#include <stdio.h>
#include <windows.h>

int main(){

	JOYINFOEX JoyInfoEx;
	JoyInfoEx.dwSize = sizeof(JOYINFOEX);
	JoyInfoEx.dwFlags = JOY_RETURNALL;

	for(unsigned int i=0;i<joyGetNumDevs();i++){//サポートされているジョイスティックの数を返す
		if(JOYERR_NOERROR == joyGetPosEx(i, &JoyInfoEx))
		printf("ジョイスティック No.%d 接続されています\n",i);
	}
	Sleep(1000);

	while(1){
		if(JOYERR_NOERROR == joyGetPosEx(0, &JoyInfoEx)){ //0番のジョイスティックの情報を見る
			printf("dwXpos = 0x%x\t"
				"dwYpos = 0x%x\t"
				"dwButtons = 0x%x\n",
				JoyInfoEx.dwXpos,
				JoyInfoEx.dwYpos,
				JoyInfoEx.dwButtons);
		  }else{
			printf("エラー\n");
		}
		Sleep(100);
	}
	return 0;
}

▼実行結果

ゲームパッドを操作すると数字が変化するはずです。

ジョイスティック No.0 接続されています
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0



■ジョイパッドの変化をウィンドウメッセージで受け取る

joySetCaptureを使うとウィンドウメッセージで受け取れるそうです。
ただし内部ではスリープを使うそうなので無限ループと同じかと思います。

joySetCapture(
	ウインドウハンドル,
	JOYSTICKID1 または JOYSTICKID2,
	定期的に問い合わせる時間ミリ秒,
	位置フラグ FALSEだと定期的に送ってくる)

調べてみるとこのような関数らしいです。
ウインドウアプリケーションのメッセージループをいじれば動くみたいです。

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
	switch(msg){
		case WM_CREATE:
			ジョイスティック1のキャプチャ開始
			30ミリ秒ごとに問い合わせる
			if(JOYERR_NOERROR!=joySetCapture(hWnd, JOYSTICKID1, 30, FALSE)){
			}
			break;
		case MM_JOY1MOVE:
			joySetCaptureのフラグがFALSEだから十字キーが押されたとか関係なく
			定期的にメッセージが飛んでくるよ
			LPARAMの上下ワードに十字キーのxy位置が入ります
			break;
		case MM_JOY1BUTTONUP:
			JOY_BUTTON1CHG,JOY_BUTTON2CHG,JOY_BUTTON3CHG,JOY_BUTTON4CHGが使えるらしい
			if(JOY_BUTTON1CHG==wp){
				ボタン1が上がった
			}
			break;
		case MM_JOY1BUTTONDOWN:
			JOY_BUTTON1,JOY_BUTTON2,JOY_BUTTON3,JOY_BUTTON4が使えるらしい
			if(JOY_BUTTON1&wp){
				ボタン1が押された
			}
			break;
		case WM_CLOSE:
			キャプチャを止める
			joyReleaseCapture(JOYSTICKID1);
			break;
	}
	return 0;
}
このような感じにすると動くそうです。

なにはともあれ実際に動かしてみたほうが手っ取り速いかも。

ジョイスティック1に接続して画面上に十字キーのデータを表示
ボタン1のダウンとアップでメッセージボックス表示
するテキトウに作ったサンプルプログラム

joypad1.ZIP
実行ファイル+ソース VC6で作成




▲トップページ > Windows と C++