Skip to content

Instantly share code, notes, and snippets.

@x0oey6B8
Last active October 19, 2024 03:54
Show Gist options
  • Save x0oey6B8/e384eac172f723d0db7888beb1ce77cd to your computer and use it in GitHub Desktop.
Save x0oey6B8/e384eac172f723d0db7888beb1ce77cd to your computer and use it in GitHub Desktop.
更新履歴

重要な変更

バージョン240515より設定ファイル用フォルダ名の変更を行いました。
新しいフォルダ名はこちらに書いてあります。

24/10/17 更新

変更

  • 一部のアプリで特定のキー入力が正しく認識されない問題を修正しました。

24/10/07 更新

変更

  • DPI に関する調整を行いました。

24/09/30 更新

変更

  • 一部のアプリで特定のキー入力が正しく認識されない問題を修正しました。
  • KeyToKey 初回起動時、作成したマクロや割り当てがロードされない不具合を修正しました。
  • 「カーソル割り当てのセットアップ」を割り当て画面から右の「スティックでマウスカーソルを操作」へ移動しました。
  • 「カーソル割り当て」の使用は非推奨となりました。

新しい機能

  • 割り当て設定(コントローラー)に「スティックでマウスカーソルを操作」を実装しました。カーソル割り当てより、より自然に操作が可能です。
  • 各割り当て+「スティックでマウスカーソルを操作」に設定項目「実行条件」を追加しました。グローバル変数を使ってその割り当てを実行できるかどうかを制御できます。
  • 拡張スクリプトで定義したプロファイルの実行許可をメインウィンドウに表示するようにしました。

24/07/19 更新

変更

  • 拡張スクリプトによる「アプリの許可実行」の不備を修正しました。

24/07/18 更新

変更

  • ブロックマクロのイベントが正常に実行されない不具合を修正しました。

24/07/17 更新

変更

  • コントローラーでマクロを実行しようとするとコンソールに例外が出力される問題を修正しました。
  • マウススクロールや CapsLock など、一部特殊な入力をトリガーとしてマクロを実行したとき、トリガーの入力がキャンセルされない問題を修正しました。
  • vJoy のマッピング設定を有効にしなくても設定を変更できるようにしました。
  • ブロックマクロ内からブロックマクロを強制終了出来るようにしました。

C#に関する修正

変更  内容
追加 Bounds.Size,Point
追加 IWindowController.MoveTo,Resize,KillProcess,FindChild
修正 IWindowController.AlwaysOnTopfalseを代入したとき
ウィンドウの最前面表示が解除されない不具合を修正しました。
廃止 Bounds.ToCenter

VirtualXInputStick.SetValue に関する不具合

VirtualXInputStick.SetValueverticalが下方向にマイナス値となっていたため、上方向をマイナスとするSetValueV2 を実装しました。
既存のSetValueは、現在利用中のユーザーへの影響を考慮し、引き続きそのままの使用可能とします。

// コントローラー取得
var controller = VirtualXInput.GetController();
// 上に100%
controller.LeftStick.SetValue(horizontal: 0, vertical: 1.0);
// 下に100%
controller.LeftStick.SetValue(horizontal: 0, vertical: -1.0);

本来

// コントローラー取得
var controller = VirtualXInput.GetController();
// 上に100%
controller.LeftStick.SetValue(horizontal: 0, vertical: -1.0);
// 下に100%
controller.LeftStick.SetValue(horizontal: 0, vertical: 1.0);

SetValueV2

// コントローラー取得
var controller = VirtualXInput.GetController();
// 上に100%
controller.LeftStick.SetValueV2(horizontal: 0, vertical: -1.0);
// 下に100%
controller.LeftStick.SetValueV2(horizontal: 0, vertical: 1.0);

「特定のアプリでのみ実行を許可」に関する変更

「特定のアプリでのみ実行を許可」に関する不具合の修正と拡張スクリプトの仕様を変更しました。

不具合について

拡張スクリプトにアプリの実行許可を行うメソッドを定義すると環境設定の「特定のアプリでのみ実行を許可」の設定が無視される問題を修正しました。

[WhitelistCondition]
bool Condition()
{
    // 「以下のアプリ"以外"で実行を許可する」が設定されていると戻り値を反転する必要があった
    return true;
}

拡張スクリプトの仕様変更について

環境設定の「特定のアプリでのみ実行を許可」の設定にある「以下のアプリ"以外"で実行を許可する」が拡張スクリプトのメソッドに影響を及ぼさないようにしました。
また、アプリの実行許可を行うメソッドの記述方法を変更しました。

古い書き方

この記述方法は古くなりますが、引き続き利用可能です。

[WhitelistCondition]
bool Condition()
{
    // 「以下のアプリ"以外"で実行を許可する」が設定されていると戻り値を反転する必要があった
    return true;
}

新しい書き方

スクリプトエディタのテンプレート機能からwhitelistconと検索することで簡単に作成できます。

[WhitelistCondition]
ProfilePermissionResult Conditon(CurrentProfilePermissionStatus status)
{
    return new ProfilePermissionResult
    {
        IsGranted = true, // trueで許可、「以下のアプリ以外で実行を許可する」は影響しない
        IgnoreOtherSettings = false // プロファイルや他メソッドの実行許可設定を無視する
    };
}

24/06/13 更新

新しい機能

  • 割り当て設定に「マクロを割り当てる(長く押したとき、その後、離したとき)」

修正

  • 割り当て「マクロを割り当てる(押したとき、離したとき)」でブロックマクロを使用すると、「マクロの終了を待機する」が原因でマクロが実行できなくなる問題を修正しました。
  • 割り当て設定のメニューの名前を変更しました。

24/05/15 更新

修正

  • __extension.csx ファイルが空の状態の場合にブロックマクロが読み込めない不具合を修正しました。

24/05/14 更新

変更

  • WindowsTerminal 使用時にコンソールが非表示にならない不具合を修正
  • 画像認識の設定でモニターのサイズに合わせるボーダーの色を変更しました。

新しい機能

  • 新しいマクロ機能「ブロックマクロ」を追加しました。
  • 画像認識の設定に「ダウンスケール」を追加しました。
  • 画像認識の設定をグループ化できるようにしました。

C#スクリプトの変更

  • SpeechLanguage に「English」を追加しました(なお誤字である「Enlgish」に関しては互換性のため残してあります)
変更
内容
[追加] DualShock4.SetMappingState
[変更] vJoy の入力アクセスする場合に WithMapping プロパティを介さなくても入力にアクセスできるようにしました。
変更前:vJoy.GetDevice(0).WithMapping.A.Down();
変更後:vJoy.GetDevice(0).A.Down();
[修正] VirtualXInput.ResetAll が機能しない不具合を修正しました。

23/08/05 更新

変更

  • C#スクリプトにおいて画像認識の結果が 1000 倍になる不具合を修正しました。
  • しました。
  • キーボード・マウスの状態管理に関する調整を行いました。
  • マクロの実行に関する調整を行いました。

23/07/07 更新

変更

  • 「ウィンドウをアクティブにする」に数値入りのプロセス名を指定した場合に正しく動かない不具合を修正しました。
  • キーボード・マウスの状態管理に関する調整を行いました。
  • 画像認識の座標と範囲を選択するウィンドウが正しい位置に表示されない問題に関する調整を行いました。

23/04/04 更新

修正

  • キー割り当ての「フェーズ 2 をスキップする」が機能してない不具合を修正しました。

23/03/30 更新

変更

  • 入力の可視化(DS4)のスティックの挙動を調整しました。
  • 割り当て設定(コントローラー)のマクロ割り当て(短く押したとき、長く押したとき)において、短押しマクロ実行後、長押しマクロが実行される不具合を修正しました。
  • 「環境設定」のオプション「IME が有効時に KeyToKey を無効にする」を廃止しました。

新しい機能

  • 環境設定に「プロファイルの有効/無効が切り替わったことを音で通知する」を追加しました。「アプリケーションの設定」での設定を上書きすることができます。
  • 割り当て設定(キー/マウス)でマウスホイールの左右をトリガーとして使えるようにしました。
    開発者の使用するロジクール製マウスでは左右のマウスホイールの入力はアプリから入力されている判定になっていたので、ページ上部にある南京錠マークから割り当て実行のロックを解除する必要がありました。※デフォルトではアプリによる入力で各割り当てを実行することができないようになっています。
  • コンソールウィンドウの位置とサイズが記憶されるようになりました(KeyToKey 起動時に若干位置とサイズがズレて表示される可能性あり)。もし何か問題があった場合はメインウィンドウの「コンソール」から「ウィンドウの位置とサイズを記憶」をオフにすれば機能を無効にできます。
  • ViGEm の DualShock4(PS4 コントローラー) を新しく使えるようにしました。
  • 「アプリケーションの設定」に「ViGEm Bus Driver をインストールする」を追加しました。
  • 「アプリケーションの設定」に「仮想 DualShock4 コントロラーを有効にする」を追加しました。
  • 「割り当て設定(コントローラー)」に「コントローラーの入力を仮想 DualShock4 コントローラーにマッピングする」を追加しました。
  • キー割り当ての「使用する仮想コントローラー」に DualShock4 を追加しました。
  • ジェスチャー割り当ての設定に「ジェスチャーに必要なマウスの移動距離」を追加しました。
  • DualShock4 用の設定ファイルが存在しない場合は自動で作成されるようにしました。

新しい XInput 仮想コントローラー

新しい仮想 XInput コントローラーのドライバとして ViGEm が使用できるようになりました。
従来のドライバは 新しい KeyToKey に同梱されなくなり、インストールもできなくなります。
アンインストールに関してはアンインストール用のファイルが残っている場合にのみ「アプリケーションの設定」で可能になります。
新旧どちらのドライバを使用するかはアプリケーションの設定で選択することができます。

入力の記録(C#スクリプトとアクション)

  • ウィンドウの位置とサイズが記録されるようになりました。
  • 設定に「原点座標にタイトルバーを含める」を追加しました。
  • 「プロセス名」を「プロセス名/ウィンドウタイトル」に変更し、設定用のボタンを追加しました。

C#スクリプトの変更

変更 内容
追加 DualShock4 { get; set; }
追加 IVirtualXInputDevice.SetDpad(bool up = false, bool down = false, bool left = false, bool right = false)
追加 MoveMethodOptions { get; set; }
追加 Controller.LitDirectInputDevices()
追加 Controller.GetDirectInputController(IDirectInputDevice device)
追加 Controller.GetXInputController(int userInex = 0)

マウスカーソルの移動に原点座標を設定

Move系メソッドに原点座標を設定することができるようになりました。

var originX = 100;
var originY = 50;

// 原点座標をプロパティから設定
MoveMethodOptions.OriginX = originX;
MoveMethodOptions.OriginY = originY;

// 原点座標をメソッドで設定
MoveMethodOptions.SetOrigin(x: originX, y: originY);
// Tuple
var p = (originX, originY);
MoveMethodOptions.SetOrigin(point: p);
// Bounds
MoveMethodOptions.SetOrigin(new Bounds(originX, originY, 0, 0));

// x = 100(origin) + 10
// y = 50(origin) + 80
Move(x: 10, y: 80);

Move の座標にランダムな値を加える

// Moveのx座標に-10~10の間でランダムな値を加えます。
MoveMethodOptions.RandomOffsetRangeX = 10;
// Moveのy座標に-5~5の間でランダムな値を加えます。
MoveMethodOptions.RandomOffsetRangeY = 5;

// メソッドで設定することもできます。
MoveMethodOptions.SetRandomOffsetRange(x: 10, y: 5);

// x: 100 + (-10 ~ 10)
// y: 50 + (-5 ~ 5)
Move(x: 100, y: 50);

仮想 XInput の十字キーの状態を設定

var c = VirtualXInput.GetController(userIndex: 0);

// 全方向
c.SetDpad(up: true, down: true, left: true, right: true);

// 上下
c.SetDpad(up: true, down: true);

// 左右
c.SetDpad(left: true, right: true);

// ニュートラル
c.SetDpad();

別のコントローラーを取得する

割り当て設定(コントローラー)で設定されているコントローラーとは別のコントローラーの入力を取得できるようにしました。

XInput コントローラーを取得する場合

// userIndex: 0~3
var controller = Controller.GetXInputController(userIndex: 0);

DirectInput コントローラーを取得する場合

// DirectInputデバイスの一覧を取得します。
var devices = Controller.ListDirectInputDevices();

// 名前(フルネーム)でデバイスを探します。
var device = devices.FirstOrDefault(device => device.Name == "Wiress Controller");

//  名前の一部で探す場合
// var device = devices.FirstOrDefault(device => device.Name.IgnoreCaseContains("名前の一部"));

//  デバイスが複数ある場合はInterfacePathを使って探す必要があります。
// var device = devices.FirstOrDefault(device => device.InterfacePath == "");

// デバイスが見つからなかった場合
if (device == null)
{
    Console.WriteLine("デバイスが見つかりませんでした");
    return;
}

// 取得したデバイスを使ってコントローラーを取得します。
var controller = Controller.GetDirectInputController(device);




過去の更新履歴

23/02/22 更新

変更

  • ウィンドウに関する不具合を修正しました。

23/02/20 更新

変更

  • 「画像認識の設定」の一部 UI が更新されない不具合を修正しました。

23/02/19 更新

変更

  • マクロ割り当てのダブルタップ時と長押し時の「トリガーを離したときに実行中のマクロを終了させる」が機能していない問題を修正しました。
  • マクロ割り当て(長押ししたとき)が多重に実行できる問題を修正しました。
  • 「画像認識の設定」画面で、「画面を撮影してテストを実行」ボタンを押すと表示される開始ウィンドウの表記が正しくない問題を修正しました。
  • 特定のウィンドウがモニターの範囲外に表示される可能性があったとき、ウィンドウの位置をメインモニターに移動するようにしました。
  • テンプレート画像と認識する画像の種類(RGB<=>ARGB)が異なる場合テンプレート画像に種類を合わせるように変更しました。
  • コントローラーの割り当て実行に関する調整を行いました。
  • メニュー割り当てのメニューに関する UI の調整を行いました。
  • 高 DPI 環境下で KeyToKey 再起動後、ウィンドウの位置やサイズが元に戻らない現象に関する調整を行いました。
  • UI の調整を行いました。

新しい機能

  • メニュー割り当てに「マウスを使わない」を追加しました
  • メニュー割り当てに表示位置をマウスカーソルか、固定座標かを選択できるようにしました
  • C#スクリプトエディタの上に「テンプレート」を追加しました。

画像認識の設定に関する新しい機能

  • テンプレート画像選択時フォルダの位置が記憶されるようにしました。
  • テンプレート画像の設定に「クリップボードの画像を保存+選択」を追加しました。
  • テンプレート画像の設定に「画像を切り抜く」を追加しました。
  • テンプレート画像の撮影時のオプションに「撮影箇所を座標と範囲に設定する」を追加しました。
  • 座標と範囲に「画像から座標と範囲を選択」を追加しました。
  • 座標と範囲に「プロセス・ウィンドウを指定」を追加しました。
  • 座標と範囲に「実行時アクティブウィンドウを指定」を追加しました。
  • 座標と範囲に「検出するウィンドウの範囲にタイトルバーを含める」を追加しました。
  • スコアとテストに「画像ファイルからテスト」を追加しました。
  • スコアとテストに「クリップボードの画像からテスト」を追加しました。

C#スクリプトの変更

変更 内容
追加 Clipboard.Text { get; set; }
追加 Clipboard.Image { get; }
追加 SendBroadcast(string channel, string message)
追加 event BroadcastReceived
変更 SharedResources { get; } の値がプロファイルのリロードによってクリアされなくなりました。

メッセージの送受信

スクリプトやプロファイル間でのメッセージの送受信ができるようになりました。

SendBroadcastメソッドでメッセージを送信します。

例では int から Json に変換して送信しています。

int data = 32// 任意の値

SendBroadcast(channel: "受信側に送る任意の文字列", message: data.ToJson());

BroadcastReceivedイベントで受信を行います。

例では受信したJsonからintに変換しています。

BroadcastReceived += (sender, e) =>
{
    if (e.Channel == "送信側が設定した任意の文字列")
    {
        Console.WriteLine(e.Message.FromJsonTo<int>()); // 32が表示される
    }
};

特定のアプリでのみ実行を許可

「特定のアプリでのみ実行を許可」を C#スクリプトで条件設定できるようにしました。

__extension.csx ファイルに以下のように記述することで条件設定することができます。

記述するだけで機能するので、UI での設定は必要ありません。

[WhitelistCondition]
bool Condition
{
    // trueで許可、falseで不許可
    //「特定のアプリでのみ実行許可」のオプションが
    //「以下のアプリ"以外"で実行を許可」になっている場合は値の意味が反転します。
    return true;
}

メソッドの定義は次の条件に従う必要があります。

  • メソッドにWhitelistCondition属性を付与する必要があります。
  • 戻り値はbool型を設定する必要があります。
  • パラメーターは設定できません。
  • メソッドは実行許可の処理に組み込まれ何度も繰り返し実行されるため、メソッド自体の処理で時間がかかると実行許可の機能が停滞します。Wait やウィンドウを表示する、特定のイベントを待つような処理は避けてください。
  • プロファイルが無効、もしくは実行できないアプリであった場合でも、メソッドの処理は止まりません。

名前は何でも OK で複数定義可能です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment