はじめに
プログラムでゲーム用コントローラーを操作する方法を探していて、見つけたので備忘録です
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);