LoginSignup
0
0

vJoy + C# を用いて、ゲームパッド入力をシミュレートする方法

Posted at

はじめに

プログラムでゲーム用コントローラーを操作する方法を探していて、見つけたので備忘録です

1. vJoyをインストール

これが仮想コントローラーで、これをSDKで操作する形になります。

2. vJoy SDK をダウンロード

vJoyを操作できるSDKです

今回はC#なので、以下を使います

SDK/c#/x64/vJoyInterfaceWrap.dll
SDK/c#/x64/vJoyInterface.dll

3. dotnet project

Visual Studio プロジェクトでもできますが、ファイルの参照等が見やすいので、vscodeで作成します。

1. C# コンソールアプリを作成

Visual Studio で.NET環境をインストールしていれば、dotnet を利用できるため、それを利用して新しいプロジェクトとして初期化します。

dotnet new console

2. dll をコピー

プロジェクト直下に libディレクトリを作成し、その中に vJoyInterfaceWrap.dll vJoyInterface.dll をコピーします。
以下のようなディレクトリ構造にします。

project
|-lib
|  |-vJoyInterface.dll
|  |-vJoyInterfaceWrap.dll
|-obj
|  | ...
|-Program.cs
|-project.csproj

3. csprojに追加

このままでは参照してくれないので、参照に追加します。
C#のコーディングには、vJoyInterfaceWrapの方の参照のみで良いですが、実行時にどうディレクトリにvJoyInterface が必要になるため、これをリンクさせます。

<ItemGroup>
    <Reference Include="vJoyInterfaceWrap">
        <HintPath>lib\vJoyInterfaceWrap.dll</HintPath>
    </Reference>
    <None Update="lib\vJoyInterface.dll">
        <Link>vJoyInterface.dll</Link>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>

5. コード

以下操作するためのコードになります。

using vJoyInterfaceWrap;

// vJoyオブジェクトの作成
var joystick = new vJoy();

// vJoyのバージョン確認
if (!joystick.vJoyEnabled())
{
    Console.WriteLine("vJoy driver not enabled.");
    return;
}

// vJoyデバイスが存在し、使用可能であるか確認
uint vJoyId = 1;
if (!joystick.isVJDExists(vJoyId))
{
    Console.WriteLine("vJoy Device with ID {0} is not available.", vJoyId);
    return;
}

// vJoyデバイスを取得
VjdStat status = joystick.GetVJDStatus(vJoyId);
if (status != VjdStat.VJD_STAT_FREE) {
    Console.WriteLine("vJoy Device with ID {0} is not free.", vJoyId);
    return;
}

// vJoyデバイスをアクティブにする
if (!joystick.AcquireVJD(vJoyId)) {
    Console.WriteLine("vJoy Device with ID {0} dose not activate.", vJoyId);
    return;
}

// 軸の値を設定
Console.WriteLine("MIN");
joystick.SetAxis(0x0, vJoyId, HID_USAGES.HID_USAGE_X);
joystick.SetAxis(0x0, vJoyId, HID_USAGES.HID_USAGE_Y);
joystick.SetAxis(0x0, vJoyId, HID_USAGES.HID_USAGE_RX);
joystick.SetAxis(0x0, vJoyId, HID_USAGES.HID_USAGE_RY);

Console.WriteLine("MAX");
joystick.SetAxis(0x8000, vJoyId, HID_USAGES.HID_USAGE_X);
joystick.SetAxis(0x8000, vJoyId, HID_USAGES.HID_USAGE_Y);
joystick.SetAxis(0x8000, vJoyId, HID_USAGES.HID_USAGE_RX);
joystick.SetAxis(0x8000, vJoyId, HID_USAGES.HID_USAGE_RY);

Console.WriteLine("CENTER");
joystick.SetAxis(0x4000, vJoyId, HID_USAGES.HID_USAGE_X);
joystick.SetAxis(0x4000, vJoyId, HID_USAGES.HID_USAGE_Y);
joystick.SetAxis(0x4000, vJoyId, HID_USAGES.HID_USAGE_RX);
joystick.SetAxis(0x4000, vJoyId, HID_USAGES.HID_USAGE_RY);

// vJoyデバイスの解放
joystick.RelinquishVJD(vJoyId);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0