C#のWinFormsプロジェクトで、Windows.Gaming.Input アセンブリを利用してゲームコントローラーのボタンやトリガーのイベントを取得したい場合の方法を備忘録的に投稿します。
‘Windows.Gaming.Input’ で取得
C#で、Windowsに接続しているゲームコントローラーの状態を取得するには[Windows.Gaming.Input]アセンブリが簡単です。
using Windows.Gaming.Input
ビルドすると、プロジェクトによっては ”CS0234: 型または名前空間の名前 ‘Gaming’ が名前空間 ‘Windows’ に存在しません (アセンブリ参照があることを確認してください)” が表示される場合があります。
詳しい内容と対処法は、別記事をご覧ください。
ループでメッセージを取得
[Windows.Gaming.Input]アセンブリでは、RawInputやHID APIと同様に、ループでWindowsから飛んでくるメッセージを捕捉してゲームコントローラーの状態が取得できます。
RawInputやHID APIでは生データとして取得されますが、[Windows.Gaming.Input]では、ボタンやトリガーに対応する構造体が用意されているので、メッセージで取得されるデータを気にせずに処理が可能になっています。
とりあえず、左のアナログスティックとAボタンの状態を捕捉するコードです。
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Windows.Gaming.Input;
class WinGamingInput: NativeWindow
{
private bool running = true;
public MyWindow()
{
CreateHandle(new CreateParams());
// 入力ループ開始
Task.Run(InputLoop);
}
private async Task InputLoop()
{
while (running)
{
foreach (var gamepad in Gamepad.Gamepads)
{
var state = gamepad.GetCurrentReading();
Debug.WriteLine($"LX: {state.LeftThumbstickX:F2}");
if (state.Buttons.HasFlag(GamepadButtons.A))
{
Debug.WriteLine("A Pressed");
}
}
await Task.Delay(16); // 約60FPS
}
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
}
}
ビルドして、ゲームコントローラーで[A]ボタンを操作するとデバッグの出力画面に “A Pressed” が表示されます。
まとめ
今回は短い記事ですが、Windows.Gaming.Input アセンブリを利用してゲームコントローラーのボタンやトリガーのイベントを取得したい場合の方法をについて書きました。
“Windows.Gaming.Input” アセンブリを利用すると、接続されたゲームコントローラーの状態を比較的、簡単に取得が可能です。
WinFormsプロジェクトでゲームコントローラーのボタンやスティックの操作が取得したい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。
