[Win32] joyGetPos の使い方

ジョイパッドによる操作を行えるようにすることを目的に、Win32 api の joyGetPos 関数を使う方法を以下にまとめます。

 

 

 

1. まずは動かしてみる

[概要]

joyGetPos 関数を使って、まずはジョイスティックの操作を読めるようにプログラムを動かしてみます。
ジョイスティックを検出して、上下左右、各種ボタンの押下状態、をコンソールへ出力するプログラムを作成してみます。
以下の4つの要素として情報を取得できます。

- wXpos      : 無操作状態で 32511 を表示しました。
- wYpos      : 無操作状態で 32511 を表示しました。
- wZpos      : Zpos を変更できる入力装置がないためか、今回のテストでは常に0でした。
- wButtons : 無操作状態で 0、各ボタン押下により対応するビットが 1 になるようです。


[環境]

 

動作例

 

["stdafx.h"]

#pragma once

#define WINVER          0x0601    // Windows7 をミニマム動作対象とする
#define _WIN32_WINNT    0x0601    // Windows7 をミニマム動作対象とする

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

// TODO: プログラムに必要な追加ヘッダーをここで参照してください
#include <Windows.h>
#include <mmsystem.h>             // joyGetPos, JOYINFO, JOYSTICKID1

#include <iostream>               // cout, endl
#include <string>

 

["testJoyGetPos.cpp"]

#include "stdafx.h"

#pragma comment(lib, "winmm.lib")

using namespace std;

namespace console {

// カーソル位置指定 for Windows Console
void setCursorPos(int x, int y)
{
    HANDLE  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD   pos;

    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hConsole, pos);
}

// カーソル位置取得
void getCursorPos(int& x, int&y) {
    HANDLE  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO  consoleScreenBufferInfo;

    GetConsoleScreenBufferInfo(hConsole, &consoleScreenBufferInfo);

    x = consoleScreenBufferInfo.dwCursorPosition.X;
    y = consoleScreenBufferInfo.dwCursorPosition.Y;
}

// カーソル表示状態取得
bool getConsoleCursorVisible()
{
    HANDLE                  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO     consoleCursorInfo;

    GetConsoleCursorInfo(hConsole, &consoleCursorInfo);

    return consoleCursorInfo.bVisible;
}

// カーソル表示状態設定
void setConsoleCursorVisible( bool bVisible ) 
{
    HANDLE                  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO     consoleCursorInfo;

    GetConsoleCursorInfo(hConsole, &consoleCursorInfo);
    consoleCursorInfo.bVisible = bVisible;
    SetConsoleCursorInfo(hConsole, &consoleCursorInfo);
}

} // console


int main()
{
    JOYINFO     joyInfo;            // ジョイスティックの情報を格納する変数
    bool        bConnected = false;
    bool        bLoop = true;       // true の間だけ処理をループ。false になったらプログラムを終了。

    cout << "Finish to hit [Enter] key !! " << endl;

    while (bLoop) {
        // ジョイスティック 情報取得処理
        {
            MMRESULT result = joyGetPos(JOYSTICKID1, &joyInfo);

            if (result == JOYERR_NOERROR) {
                console::setConsoleCursorVisible(false);

                // JOYSTICKID1 と接続できた
                if (bConnected == true) {
                    // 表示位置を5行上へ移動
                    int x, y;
                    console::getCursorPos(x, y);
                    console::setCursorPos(x, y - 5);
                }
                else {
                    // 水平線を挿入
                    cout << "-------------------------------" << endl;
                }
                bConnected = true;

                // ジョイスティック情報をコンソールへ出力
                cout << "wXpos    = " << joyInfo.wXpos    << "     " << endl;
                cout << "wYpos    = " << joyInfo.wYpos    << "     " << endl;
                cout << "wZpos    = " << joyInfo.wZpos    << "     " << endl;
                cout << "wButtons = " << joyInfo.wButtons << "     " << endl;
                cout << "-------------------------------" << endl;

                console::setConsoleCursorVisible(true);
            }
            else {
                if (bConnected == true) {
                    // ジョイスティックの接続が変わったことを通知
                    // この処理をやらないと異なるUSBポートへ再接続したときに
                    // ジョイスティックが動かなくなる。
                    joyConfigChanged(0);
                }
                bConnected = false;

                switch (result) {
                case MMSYSERR_BADDEVICEID:      // 2
                    cout << "result code = MMSYSERR_BADDEVICEID" << endl;
                    break;
                    
                case MMSYSERR_NODRIVER:         // 6
                    cout << "result code = MMSYSERR_NODRIVER" << endl;
                    break;

                case MMSYSERR_INVALPARAM:       // 11
                    cout << "result code = MMSYSERR_INVALPARAM" << endl;
                    break;

                case JOYERR_PARMS:              // 165: bad parameters
                    cout << "result code = JOYERR_PARMS" << endl;
                    break;

                case JOYERR_NOCANDO:            // 166: request not completed
                    cout << "result code = JOYERR_NOCANDO" << endl;
                    break;

                case JOYERR_UNPLUGGED:          // 167: joystick is unplugged
                    cout << "result code = JOYERR_UNPLUGGED" << endl;
                    break;

                default:
                    cout << "result code = " << result << endl;
                    break;
                }
            }
        }

        // [Enter] キーを押されたらプログラム終了
        if (GetAsyncKeyState(VK_RETURN)) {
            cout << endl << "Finish this program.";
            bLoop = false;
            Sleep(2000);
        }

        // 一定時間待機
        if (bConnected == true) {
            // 短時間の待機
            Sleep(100);
        }
        else {
            // 長めの待機
            Sleep(500);
        }
    }

    return EXIT_SUCCESS;
}

 

 

ライセンス

本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。

The MIT License (MIT)

Copyright © 2018-2022 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

 

参考

 


 

変更履歴

2022-12-09 - ページデザイン更新
2018-05-19 - 新規作成

 

Programming Items トップページ

プライバシーポリシー