C#スクリプトの基本的な仕様 - x0oey6B8/KeyToKey-Web GitHub Wiki

目次

  1. 基本的な仕様
    1. 言語バージョンと拡張子
    2. usingの省略
    3. エントリーポイントの省略
    4. 記述順序
    5. 参照と外部スクリプト
  2. KeyToKeyの独自仕様
  3. クラスにKeyToKey専用メンバを実装する
  4. スクリプトの強制終了
    1. 強制終了するタイミング
    2. 強制終了の制御
    3. 注意
  5. 変数(KeyToKey)

基本的な仕様

C#スクリプトは C#といくつか違いはありますが基本的には一緒です。

言語バージョンと拡張子

C#スクリプトの言語バージョンは「8.0」で、スクリプトの拡張子は「.csx」です。

usingの省略

C#スクリプトでは以下のusingディレクティブの記述を省略することができます。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Diagnostics;
using KeyToKey.Plugins;
using KeyToKey.Enums;

エントリーポイントの省略

C#スクリプトはエントリーポイントを省略、つまりクラスやMainメソッドを省略してコードを記述していくことが可能です。 HelloWorld は 1 行で書くことができます。

Console.WriteLine("Hello World!");

記述順序

スクリプト内ではクラスやメソッドの定義が可能で、記述が前後しても呼び出しが可能です。

void A() => Console.WriteLine("A Method");
A();
B();
void B() => Console.WriteLine("B Method");

参照と外部スクリプト

C#スクリプトはアセンブリ(GAC や DLL)の参照やスクリプトファイルの読み込みができます。

パス指定

  • DLLやスクリプトのパスはKeyToKeyのディレクトリが基準になります。
  • 相対パス・絶対パスでの指定が可能です。
// 相対パス
#r "libraries\test.dll"
// GAC
#r "System.Windows.Forms"
// 相対パス
#load "Scripts\aaaa\fuga.csx"
// 絶対パス
#load "C:\Users\UserName\Desktop\KeyToKey\Scripts\Test.csx"

参照を追加

参照を追加するには#rディレクティブを使用します。 GACに登録されているアセンブリはアセンブリ名を指定するだけでOKです。 GACは%windir%\assemblyで確認できます。

スクリプトのロード

スクリプトをロードするには#loadディレクティブを使用します。 #loadはロードしたスクリプトファイルに定義されてあるクラスやメソッドを呼び出すことが可能になりますが、クラスやメソッドの外に定義されているコードが予め実行されます。 例えば以下のように指定すると

#load "Scripts\aaaa\fuga.csx"
#load "Scripts\aaaa\hoge.csx"
Console.WriteLine("Hello");

次のように実行されます。

  1. fuga.csxの内容が実行
  2. hoge.csxの内容が実行
  3. Helloが出力

KeyToKeyの独自仕様

C#スクリプトではKeyToKey独自のメソッドやプロパティ、イベントを使用することができます。

// @this @base に実装されているすべてのメンバがまとめられています(@this,@baseは省略可能です)
@this.Down(Keys.A);
@base.Up(Keys.A);

// @this @base は省略可
Down(Keys.A);

使用方法についてはスクリプトエディタの「ヘルプ」を見てください。

クラスにKeyToKey専用メンバを実装する

実装したいクラスに GlobalsBridge を継承し、コンストラクタに IGlobals のインスタンスを渡します。 IGlobals のインスタンスは @this@base プロパティで取得できます。

var instance = new TestClass(@this);
instance.Tap(Keys.A);

public class TestClass : GlobalsBridge
{
    public TestClass(IGlobals globals) : base(globals)
    {
    }
}

クラス外に専用メンバを公開する必要がない場合は、IGlobalsのインスタンスから専用メンバにアクセスすることもできます。

var instance = new TestClass(@this);
instance.DoSomething();

public class TestClass
{
    private readonly IGlobals _globals;

    public TestClass(IGlobals globals)
    {
        _globals = globals;
    }
    
    public void DoSomething()
    {
        _globals.Key.A.Tap();
    }
}

スクリプトの強制終了

C#スクリプトは KeyToKey の状態やその他条件によって強制終了するように作られています。 また、KeyToKey 以外にもスクリプト内部で強制終了することも可能です。 強制終了前には必ず Disposing イベントが発生します。

強制終了するタイミング

C#スクリプトは以下の条件、タイミングで強制終了します。

  • プロファイルが無効状態になった時
  • アクティブウィンドウが実行できないウィンドウだった場合
  • プロファイルを再読込した時
  • マクロ割り当ての設定で「トリガーを離したときに実行中のマクロを終了させる」が有効になっていた場合、トグルモードが有効になっている場合はトリガーを再度押した時

強制終了の制御

強制終了は基本的に KeyToKey が条件に従って行いますが、スクリプト内部から強制終了させることも可能です。

// スクリプトから強制終了を行います。
Abort();

一部条件の強制終了は無効にすることができます。

// KeyToKey(プロファイル)が無効になったときの強制終了を無効にします(デフォルトはtrue)
ScriptConfig.AbortWhenDisabled = false;

// 実行できないウィンドウになった時の強制終了を無効にします(デフォルトはtrue)
ScriptConfig.AbortWhenUnavailableProcess = false;

なお、スタートアップマクロのオプションで KeyToKeyの有効無効 をオフにした場合はScriptConfig.AbortWhenDisabledfalseに設定されます。 また、実行許可をオフにした場合はScriptConfig.AbortWhenUnavailableProcessfalseに設定されます。

⚠️ 注意

強制終了は実行中のスクリプトを終了させることができますが、スクリプト内でスレッドを生成していた場合そのスレッドは KeyToKey によって強制終了されることはありません。 もしスレッドを生成している場合は適切な解放処理を行う必要があります。

変数(KeyToKey)

C#スクリプトは基本的にマクロの枠組みで実行されるためKeyToKey側の変数にアクセスすることが出来ます。 例えば以下のようにアクションマクロ内で拡張スクリプトて定義したアクションを実行した場合、スクリプト側からアクションマクロのローカル変数にアクセス出来ます。

image

[Action]
void 拡張スクリプトのアクション()
{
    // 実行元のマクロ内の変数の値を取得する
    var value =  LocalVariables["$変数名"];
    
    // 実行元のマクロ内の変数に値を設定する
    LocalVariables["$変数名"] = 123;
}