vJoyの設定ツール vGamePadConfig.exe について



vJoyの設定を独自プログラムで実装する

vGamePad 0.9.6.2からvGamePadConfig.exeをC#で書き換えました。(それまではC++)

ゲームパッドにはボタン数やアナログスティック数などのHW仕様というものが存在しますがvGamePadはほぼドラクエ10専用ということもあり仕様を固定しています。

vGamePadの場合、設定作業をvGamePadConfig.exeで実施していますが
そのやり方とソースコードの抜粋です。

設定情報のデータを抽出する

vJoyの設定ツールから直接指定する場合だとこんな感じになります。
Configure vJoy
Configure vJoyの右下にある”Create”にチェックを入れると設定に必要となるヘッダファイル”HidRepDesc.h”が作成されます。

C++で利用する場合はそのままヘッダファイルとして利用しますが、C#の場合は一部書き換えて使います。

// HidRepDesc.hをC#に変換
internal static byte[] G_DefaultReportDescriptor = new byte[100] {
    0x05,0x01,0x15, ... 0x81,0x01,0xC0
};

設定に必要なレジストリ

vJoyの設定情報は以下のレジストリに保存されています。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\vjoy\Parameters

実際はTarget Deviceに応じてサブキーが割り当てられます。
1つ目のデバイスは”Device01″、2つ目のデバイスは”Device02″となります。
各デバイスに2つのデータを設定します。

HidReportDesctiptor
(REG_BINARY) vJoyの設定情報を表すバイナリデータ

HidReportDesctiptorSize
(REG_DWORD) バイナリデータのサイズ

で、先ほどのバイナリデータをレジストリに書き込むコードです。

var RegKey = Registry.LocalMachine.CreateSubKey("SYSTEM\\CurrentControlSet\\Services\\vjoy\\Parameters\\Device01");
RegKey.SetValue("HidReportDesctiptor", G_DefaultReportDescriptor);
RegKey.SetValue("HidReportDesctiptorSize", G_DefaultReportDescriptor.Length);

設定に必要なAPI

レジストリを書き換えたことをドライバに通知する必要があります。
そのAPIは”vJoyInstall.dll”にあります。

vJoyをインストールすると、
32ビット環境:c:\Program Files\vJoy\x86\vJoyInstall.dll
64ビット環境:c:\Program Files\vJoy\x64\vJoyInstall.dll
にあるのでそれを使います。

C#から使えるようにいつものおまじない的ソースです。

public static partial class NativeMethods
{
    [DllImport("kernel32", SetLastError = true)]
    internal static extern bool SetDllDirectory(string lpPathName);
    /*
     * typedef BOOL(__stdcall *IS_VJOY_INSTALLED)();
     * IS_VJOY_INSTALLED is_vjoy_installed;
     * typedef VOID(__stdcall *REFRESH_VJOY)();
     * REFRESH_VJOY refresh_vjoy;
     */
    [DllImport("vJoyInstall", EntryPoint = "is_vjoy_installed")]
    internal static extern bool is_vjoy_installed();
    [DllImport("vJoyInstall", EntryPoint = "refresh_vjoy")]
    internal static extern void refresh_vjoy();
}

SetDllDirectory APIはvJoyInstall.dllの場所を指定するために利用します。
パスの指定はこんな感じで切り分けます。

var DllPath = Environment.ExpandEnvironmentVariables("%ProgramFiles%\\vJoy\\");
if (IntPtr.Size == 8)
{
    // x64
    DllPath += "x64";
}
else
{
    // x86
    DllPath += "x86";
}
NativeMethods.SetDllDirectory(null);
NativeMethods.SetDllDirectory(DllPath);

is_vjoy_installed APIはvJoyがインストールされているかのチェックに、refresh_vjoyはvJoyの設定変更を通知する時に利用します。

管理者権限で実行

vJoyの設定変更は管理者権限が必要になります。
プログラムを管理者権限の指定はマニフェストファイルを作成し設定を一部変更します。

<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

ビルドオプション

.NETはCPUに応じてx86、x64のどちらでも動作するよう(Any CPUの時)にできていますが、x64の環境でもx86として動作させるオプションがデフォルトで有効になっています。

プロジェクトのプロパティビルド全般32ビットの優先

のチェックを外す必要があります。


Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です