本文へスキップ

Clamini library

マウス・キー・パッド入力制御用簡易ライブラリPetitInput

 Pascalでマウス、キーボード、ゲーム用コントローラの入力を制御するための、簡易ライブラリ(Windows11用)を作ってみました。 コントローラは、抜き差し時の認識にも対応しています!

PetitInputの仕様と使い方


 詳しい内容はリファレンスにまとめていますので、こちらを参照してください。

ダウンロード用ファイル


 下のリンクからファイルをダウンロードできます。

 petitinput.zip ※ZIP形式で圧縮されてるので、使う前に解凍してください!

ライブラリを使用したサンプル(入力チェッカー)


PetitInputサンプル
{$APPTYPE GUI}
program InputChecker;

{$MODE DELPHI}

uses
  Windows, SysUtils, PetitDraw, PetitInput;

type
  { TInputApp }
  // アプリケーション全体を管理するクラス
  TInputApp = class
  private
    FDraw: TPetitDraw;
    FInput: TPetitInput;
    FLastKey: string;
    FLastPad: string;
  public
    constructor Create;
    destructor Destroy; override;

    // クラスのメソッドとして定義 (これで PetitDraw.OnUpdate に代入可能になる)
    procedure OnUpdate;
    procedure Run;
  end;

{ TInputApp の実装 }

constructor TInputApp.Create;
begin
  // ウィンドウと入力の初期化
  FDraw := TPetitDraw.Create('PetitInput Checker (Sample Version)', 640, 480);
  FInput := TPetitInput.Create(FDraw.Handle);

  // マウスホイールの連携設定
  FDraw.OnWheelAccum := FInput.AddWheelDelta;

  // イベントの登録 (自分自身のメソッドを渡す)
  FDraw.OnUpdate := Self.OnUpdate;

  FLastKey := 'None';
  FLastPad := 'None';
end;

destructor TInputApp.Destroy;
begin
  FInput.Free;
  FDraw.Free;
  inherited Destroy;
end;

procedure TInputApp.OnUpdate;
var
  i: Integer;
  PressedKeys: string;
  PressedBtns: string;
begin
  FInput.Update;

  // --- 1. 押されているキー(A-Zなど)をすべて抽出 ---
  PressedKeys := '';
  for i := 8 to 255 do // 主要なキー範囲
  begin
    if FInput.IsKeyDown(i) then
    begin
      // A-Z (ASCII 65-90) の場合は文字として、それ以外はコードを表示
      if i in [65..90] then
        PressedKeys := PressedKeys + Chr(i) + ' '
      else if i = VK_SPACE then PressedKeys := PressedKeys + '[Space] '
      else if i = VK_LEFT  then PressedKeys := PressedKeys + '[Left] '
      // 必要に応じて他の特殊キーも追加可能
    end;

    // Trigger判定のテスト(最後に押した瞬間を記録)
    if FInput.IsKeyTrigger(i) then
      FLastKey := Format('Code:%d (Char:%s)', [i, Chr(i)]);
  end;

  // --- 2. 押されているパッドボタンをすべて抽出 ---
  PressedBtns := '';
  if FInput.HasPad then
  begin
    for i := 0 to 31 do // 32ボタン分スキャン
    begin
      if FInput.IsPadDown(DWORD(1 shl i)) then
        PressedBtns := PressedBtns + IntToStr(i + 1) + ' ';

      if FInput.IsPadTrigger(DWORD(1 shl i)) then
        FLastPad := 'Button ' + IntToStr(i + 1);
    end;

    // 十字キー(独自定義フラグ)のチェック
    if FInput.IsPadDown(PAD_UP)    then PressedBtns := PressedBtns + '[UP] ';
    if FInput.IsPadDown(PAD_DOWN)  then PressedBtns := PressedBtns + '[DOWN] ';
    if FInput.IsPadDown(PAD_LEFT)  then PressedBtns := PressedBtns + '[LEFT] ';
    if FInput.IsPadDown(PAD_RIGHT) then PressedBtns := PressedBtns + '[RIGHT] ';
  end;

  // --- 3. 描画 ---
  FDraw.Clear($222222);

  // マウス情報
  FDraw.DrawText('--- Mouse ---', 20, 20, 20, $AAAAAA);
  FDraw.DrawText(Format('Pos: %d, %d | Delta: %d, %d', [FInput.MouseX, FInput.MouseY, FInput.DeltaX, FInput.DeltaY]), 40, 50, 18, $FFFFFF);

  // キーボード情報
  FDraw.DrawText('--- Keyboard ---', 20, 100, 20, $AAAAAA);
  FDraw.DrawText('Holding: ' + PressedKeys, 40, 130, 18, $00FFFF);
  FDraw.DrawText('Last Trigger: ' + FLastKey, 40, 160, 18, $FFFF00);

  // パッド情報
  FDraw.DrawText('--- Gamepad ---', 20, 210, 20, $AAAAAA);
  if not FInput.HasPad then
    FDraw.DrawText('No Pad Detected', 40, 240, 18, $8888FF)
  else
  begin
    FDraw.DrawText('Holding Buttons: ' + PressedBtns, 40, 240, 18, $00FFFF);
    FDraw.DrawText('Last Trigger: ' + FLastPad, 40, 270, 18, $FFFF00);
  end;

  if FInput.IsKeyTrigger(VK_ESCAPE) then PostQuitMessage(0);
  FDraw.Present;
end;

procedure TInputApp.Run;
begin
  // PetitDraw のメインループを開始
  FDraw.Run;
end;

{ メインエントリーポイント }
var
  App: TInputApp;
begin
  App := TInputApp.Create;
  try
    App.Run;
  finally
    App.Free;
  end;
end.