Pascalでマウス、キーボード、ゲーム用コントローラの入力を制御するための、簡易ライブラリ(Windows11用)を作ってみました。 コントローラは、抜き差し時の認識にも対応しています!
詳しい内容はリファレンスにまとめていますので、こちらを参照してください。
下のリンクからファイルをダウンロードできます。
petitinput.zip ※ZIP形式で圧縮されてるので、使う前に解凍してください!
{$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.
|