【C#スクリプト】キーボードとマウス - x0oey6B8/KeyToKey-Web GitHub Wiki

目次

待機処理の精度

キーボード/マウスのメソッドにおける待機処理は実は精度があまりよくありません。0 ~数十ミリ秒の範囲で待機時間にムラが生じます。 待機処理の設定を変更することで高精度な待機処理を実現することはできますが高精度な待機処理は CPU 負荷が高くなります。 どちらを使うかは、その用途や負荷を考慮して設定するといいでしょう。

高精度/高負荷な待機処理を使用する

⚠️ 現在はデフォルトでtrueに設定されています。

// キーボード関係の待機処理を高精度/高負荷にする
WaitConfig.Wait.HighPrecision = true;

// マウス関係の待機処理を高精度/高負荷にする
WaitConfig.Mouse.HighPrecision = true;

キー/マウスを押す

Key.キーの名前.Down()を使用します。

// Aキーを押して200ミリ秒待機
Key.A.Down(waitTime: 200);

// Bキーを押す
Key.B.Down();

// マウスの左ボタンを押す
Key.MouseLeftButton.Down();

キー/マウスを離す

Key.キーの名前.Up()を使用します。

// Aキーを押して200ミリ秒待機
Key.A.Up(waitTime: 200);

// Bキーを押す
Key.B.Up();

// マウスの左ボタンを離す
Key.MouseLeftButton.Up();

キー/マウスを押して離す

Key.キーの名前.Tap()を使用します。

// Aキーを押して離す
Key.A.Tap();

// Bキーを押して200ミリ秒待機、離して50ミリ秒待機
Key.B.Tap(waitTimeAfterDown: 200, waitTimeAfterUp: 50);

// マウスの左ボタンを押して離す
Key.MouseLeftButton.Tap();

すべてのキー/マウスを離す

// すべてのキーを離す
Key.UpAll();

// WASD以外のキーを離す
Key.UpAll(Keys.W, Keys.A, Keys.S, Keys.D);

// WASD以外のキーを離す
var keys = new[] { Keys.W, Keys.A, Keys.S, Keys.D };
Key.UpAll(keys);

文字を入力する

// "Hello World"と入力する(1文字入力ごとに5ミリ秒待機)
InputText("Hello World!");

// "あいうえお"と入力する(1文字入力ごとに100ミリ秒待機)
InputText("あいうえお", 100);

マウスを移動させる

// 横100縦500の位置に移動させる
Move(100, 500);

// 横1920縦1080の位置に移動させ、10ミリ秒待機する
Move(1920, 1080, 10);

アニメーションあり

マウスカーソルを指定した位置(絶対座標)まで決められたステップ数(歩数)を踏んで移動します。 スムーズ移動が true の場合、ステップ数が指定した数より小さくなることがあります。

// 横200縦500の位置にスムーズに移動させます。
// 移動は300ステップでステップ毎に10ミリ秒待機します。
// ※実際には300ステップもありません。
MoveWithSteps(200, 500, 300, 10, true);

マウス移動に原点座標を設定する

原点座標を設定することで、その座標を基準に Move 系メソッドでマウスを移動させることができます。

var originX = 100;
var originY = 50;
MoveMethodOptions.SetOrigin(originX, originY);

var tuple = (originX, originY);
MoveMethodOptions.SetOrigin(tuple);

var bound = new Bounds(originX, originY, 0, 0);
MoveMethodOptions.SetOrigin(bounds);

ウィンドウ(例では電卓)の左上を原点にする

var window = FindWindow("電卓");
MoveMethodOptions.SetOrigin(window.Bounds);

// 電卓ウィンドウの左上にカーソルを移動させる
Move(0, 0);

マウスの移動先にランダム性を加える

MoveMethodOptions.SetRandomOffsetRange()を使用することでマウスの移動先にランダム性を加えることができます。

// 横の座標に-10~10の範囲でランダムな値を加える
// 縦の座標に-5~5の範囲でランダムな値を加える
MoveMethodOptions.SetRandomOffsetRange(x: 10, y: 5);
Move(0, 0);

マウスを指定した分だけ移動させる

// 横に100移動させる
Offset(100, 0);

// 横に50縦に50移動させる
Offset(50, 50);

// 横に250縦に100移動させ、1000ミリ秒待機する
Offset(250, 100, 1000);

アニメーションあり

// 横に100、縦に0移動させる
// 100ステップ行う
// ステップ毎に10ミリ秒待機する
// スムーズ移動:true
OffsetWithSteps(100, 0, 100, 10, true);

スクロール

// ホイールを上に120移動させる
WheelUp(120);

// ホイールを下に120移動させる
WheelDown(120);

// ホイールを左に120移動させる
WheelLeft(120);

// ホイールを右に120移動させる
WheelRight(120);

マウスカーソルの位置を取得する

// マウスカーソルの位置を取得します。
// タプル型なので分解可能です。
var (x, y) = GetCursorPosition();

// 分解しない場合
var p = GetCursorPosition();
var x = p.X
var y = p.Y;

キー/マウスが押されているかどうかを取得する

キー/マウスが押されているかどうかを取得します。 取得方法はいくつかあるので用途にあったものを使うといいでしょう。

物理キーボードの状態を取得する

物理キーボードの状態を取得するには PhysicalStatus プロパティを使用します。 PhysicalStatus は KeyToKey 内部で管理している物理キーの入力状態を取得することができます。 :warning:なお、物理キーボードの状態とはキーボードデバイスの状態を直接管理しているわけではなく KeyToKey が受け取った物理キーボードからの入力を管理しているという意味です。なお、PhysicalStatusはアプリによるキー入力の影響は受けません。

// KeyToKeyが管理している物理キーボードの状態
var state = PhysicalStatus[Keys.A];

アプリによる入力の状態を取得

アプリによる入力の状態するには InjectedStatus プロパティを使用します。 InjectedStatus は KeyToKey 内部で管理しているアプリによる入力の状態を取得することができます。 InjectedStatus は基本的にはアプリの入力によって状態が変わりますが物理キーボードの離す操作でも状態が変わります。

// KeyToKeyが管理しているアプリによるキーの状態
var state = InjectedStatus[Keys.A];

両方の入力を取得

PhysicalStatusInjectedStatus の両方を参照してキーが押されているか取得するには、Key.{キー/マウスボタンの名前}.IsPressed プロパティを使用します。 入力の状態を取得したい場合は基本的にはこれを使うといいでしょう。

// PhysicalStatusとInjectedStatusの両方を参照してキーが押されているか取得する
var state = Key.A.IsPressed;

// Key.A.IsPressedは下記のコードと同義です。
var state = PhysicalStatus[Keys.A] || InjectedStatus[Keys.A];

WindowsAPI による入力の状態を取得

GetAsyncKeyStateを使用します。

// Windows APIによって状態を取得する
GetAsyncKeyState(Keys.A);

キー/マウスの入力をブロックする

キー/マウスの入力をブロックするには環境設定の「入力の監視」で「フック」が設定されている必要があります。

メソッドによるブロック

Key.{キーの名前}.Block();

// Aキーの入力をブロックする
Key.A.Block();

// マウスの左ボタンの入力をブロックする
Key.MouseLeftButton.Block();

ブロックを解除する場合

Key.{キーの名前}.Unblock();

// Aキーの入力をブロックを解除する
Key.A.Unblock();

// マウスの左ボタンの入力のブロックを解除する
Key.MouseLeftButton.Unblock();

ブロックに関する注意事項

Key.{キーの名前}.Block();のブロックはスクリプトが終了しても KeyToKey によって解除されることはありません。 そのため、Disposingなどを使いスクリプト終了前にブロックを解除する必要があります。

// スクリプトが終了する前に発生します。
Disposing += (sender, e) =>
{
    Key.A.Unblock();
};

イベントによるブロック

// キー/マウスの入力が発生した場合
Hooked += (sender, e) =>
{
    // Aキーの入力をブロック
    if (e.Key == Keys.A)
    {
        // IsCancelをtrueに設定することでブロックすることができます。
        e.IsCancel = true;
    }

    // マウスの左ボタンの入力をブロック
    if (e.Key == Keys.LButton)
    {
        e.IsCancel = true;
    }

    // アプリによる入力をブロックしない場合は!e.IsInjectedを使用します。
    // e.IsInjectedはキー/マウスの入力がアプリからだった場合、値はtrueになります。
    if (e.Key == Keys.A && !e.IsInjected)
    {
        e.IsCancel = true;
    }
};

// スクリプトが終了しないようにします。
Wait();

マウスの移動をブロックする

マウスの移動をブロックするには環境設定の「入力の監視」の「マウス」が「フック」に設定されている必要があります。

// Hookedはキーやマウスの入力、マウスの移動が行われたら発生します。
Hooked += (sender, e) =>
{
    // イベントの種類がマウスの移動であれば
    if (e.EventType == EventType.Move)
    {
        // IsCancelをtrueに設定することでブロックすることができます。
        e.IsCancel = true;
    }

    // アプリによるマウス移動をブロックしない場合は!e.IsInjectedを使用します。
    // e.IsInjectedはキマウス移動がアプリからだった場合、値はtrueになります。
    // if (e.EventType == EventType.Move && !e.IsInjected)
    // {
    //     e.Iscancel = true;
    // }

};

// スクリプトが終了しないようにします。
Wait();