[C#] キー入力をプログラムから送信する方法

C#でプログラムからキー入力を送信するには、SendKeysクラスを使用する方法があります。

System.Windows.Forms名前空間に含まれるこのクラスは、アクティブなウィンドウにキー入力をシミュレートして送信します。

例えば、SendKeys.Send("A")を使用すると、アクティブなウィンドウに A キーが押されたことをシミュレートできます。

ただし、SendKeysはフォーカスのあるウィンドウにしか送信できないため、他のアプリケーションにキー入力を送信する場合は、ウィンドウをアクティブにする必要があります。

また、SendKeysは一部の環境で動作が不安定なことがあるため、より高度な操作が必要な場合は、Windows APIを利用する方法も検討できます。

この記事でわかること
  • SendKeysクラスの基本的な使い方
  • Windows APIによるキー入力の送信方法
  • ゲームやアプリでの応用例
  • トラブルシューティングのポイント
  • 自動化スクリプトの作成方法

目次から探す

SendKeysクラスを使ったキー入力の送信

C#のSendKeysクラスを使用すると、プログラムからキー入力を送信することができます。

このクラスは、特に自動化やテストのシナリオで役立ちます。

以下では、単一キー、複数キー、特殊キーの送信方法について解説します。

単一キーの送信

SendKeys.Sendメソッドを使用して、単一のキーを送信することができます。

以下は、”A”キーを送信するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void SendSingleKey()
    {
        // "A"キーを送信
        SendKeys.Send("A");
    }
}

このコードを実行すると、アクティブなウィンドウに”A”が入力されます。

複数キーの同時送信

複数のキーを同時に送信する場合は、+(Shift)、^(Ctrl)、%(Alt)を使用して修飾キーを指定します。

以下は、Ctrl + Aを送信するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void SendMultipleKeys()
    {
        // Ctrl + Aを送信
        SendKeys.Send("^a");
    }
}

このコードを実行すると、アクティブなウィンドウで全選択が行われます。

特殊キーの送信

特殊キー(例えば、EnterキーやTabキー)を送信する場合は、特定の文字列を使用します。

以下は、Enterキーを送信するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void SendSpecialKey()
    {
        // Enterキーを送信
        SendKeys.Send("{ENTER}");
    }
}

このコードを実行すると、アクティブなウィンドウでEnterキーが押されたことになります。

以上の方法を使うことで、C#プログラムから簡単にキー入力を送信することができます。

SendKeysクラスの実用例

SendKeysクラスは、さまざまなアプリケーションでの自動化や操作のシミュレーションに役立ちます。

ここでは、テキストエディタへの文字入力、ショートカットキーのシミュレーション、自動化スクリプトでの利用について具体的な例を示します。

テキストエディタへの文字入力

テキストエディタに文字を入力する場合、SendKeysを使用して簡単に実現できます。

以下は、メモ帳に”こんにちは”という文字を入力するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void InputTextToNotepad()
    {
        // メモ帳を起動
        System.Diagnostics.Process.Start("notepad.exe");
        System.Threading.Thread.Sleep(1000); // メモ帳が起動するまで待機
        // "こんにちは"を送信
        SendKeys.Send("こんにちは");
    }
}

このコードを実行すると、メモ帳が起動し、”こんにちは”という文字が自動的に入力されます。

ショートカットキーのシミュレーション

ショートカットキーをシミュレーションすることで、特定の操作を自動化できます。

以下は、Ctrl + S(保存)をシミュレーションするサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void SimulateSaveShortcut()
    {
        // メモ帳を起動
        System.Diagnostics.Process.Start("notepad.exe");
        System.Threading.Thread.Sleep(1000); // メモ帳が起動するまで待機
        // Ctrl + Sを送信
        SendKeys.Send("^s");
    }
}

このコードを実行すると、メモ帳が起動し、Ctrl + Sが送信されて保存ダイアログが表示されます。

自動化スクリプトでの利用

SendKeysを使用して、特定のタスクを自動化するスクリプトを作成することも可能です。

以下は、特定のアプリケーションを起動し、いくつかの操作を自動で行うサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void AutomateTask()
    {
        // メモ帳を起動
        System.Diagnostics.Process.Start("notepad.exe");
        System.Threading.Thread.Sleep(1000); // メモ帳が起動するまで待機
        // 文字を入力
        SendKeys.Send("自動化テストです。");
        System.Threading.Thread.Sleep(500); // 入力後に待機
        // Enterキーを送信
        SendKeys.Send("{ENTER}");
        System.Threading.Thread.Sleep(500); // 入力後に待機
        // Ctrl + Sを送信
        SendKeys.Send("^s");
    }
}

このコードを実行すると、メモ帳が起動し、指定した文字が入力された後、Enterキーが押され、保存ダイアログが表示されます。

これにより、特定のタスクを自動化することができます。

以上のように、SendKeysクラスは、さまざまなアプリケーションでの操作を自動化するために非常に便利です。

SendKeysクラスのトラブルシューティング

SendKeysクラスを使用する際に直面する可能性のある問題とその対処法について解説します。

特に、キー入力が送信されない場合やフォーカスが外れる問題について詳しく見ていきます。

キー入力が送信されない場合の対処法

SendKeysを使用してもキー入力が送信されない場合、以下の点を確認してください。

  • アクティブウィンドウの確認: SendKeysは、アクティブなウィンドウに対してキー入力を送信します。

対象のウィンドウがアクティブであることを確認してください。

  • ウィンドウの起動タイミング: プロセスを起動した直後にSendKeysを呼び出すと、ウィンドウがまだ準備できていない場合があります。

Thread.Sleepメソッドを使用して、ウィンドウが完全に起動するまで待機することが重要です。

以下は、ウィンドウが起動するまで待機するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void SendKeysWithWait()
    {
        // メモ帳を起動
        System.Diagnostics.Process.Start("notepad.exe");
        System.Threading.Thread.Sleep(1000); // メモ帳が起動するまで待機
        // "テスト"を送信
        SendKeys.Send("テスト");
    }
}

フォーカスが外れる問題の解決策

SendKeysを使用する際に、フォーカスが外れてしまうことがあります。

これにより、意図したウィンドウにキー入力が送信されない場合があります。

以下の対策を試みてください。

  • ウィンドウのフォーカスを強制する: SetForegroundWindow APIを使用して、対象のウィンドウを前面に持ってくることができます。

これにより、フォーカスが外れる問題を回避できます。

以下は、SetForegroundWindowを使用するサンプルコードです。

using System.Runtime.InteropServices;
partial class MyForm : Form
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);
    public MyForm()
    {
        InitializeComponent();
    }
    private void FocusAndSendKeys()
    {
        // メモ帳を起動
        var process = System.Diagnostics.Process.Start("notepad.exe");
        System.Threading.Thread.Sleep(1000); // メモ帳が起動するまで待機
        // メモ帳のウィンドウハンドルを取得
        IntPtr hWnd = process.MainWindowHandle;
        // メモ帳を前面に持ってくる
        SetForegroundWindow(hWnd);
        // "テスト"を送信
        SendKeys.Send("テスト");
    }
}

このコードを実行すると、メモ帳が前面に表示され、”テスト”という文字が正しく入力されます。

以上の対処法を試すことで、SendKeysクラスを使用する際の一般的な問題を解決できるでしょう。

Windows APIを使ったキー入力の送信

C#のSendKeysクラスは便利ですが、より高度なキー入力の制御が必要な場合には、Windows APIを使用することができます。

ここでは、Windows APIの概要、keybd_event関数SendInput関数の使用方法について解説します。

Windows APIの概要

Windows APIは、Windowsオペレーティングシステムとアプリケーション間のインターフェースを提供する一連の関数です。

これにより、アプリケーションはシステムリソースやハードウェアにアクセスできます。

キー入力の送信に関しては、keybd_eventSendInputといった関数が利用されます。

これらの関数を使用することで、より精密なキー入力のシミュレーションが可能になります。

keybd_event関数の使用方法

keybd_event関数は、仮想キーコードを使用してキー入力をシミュレートします。

この関数は、キーの押下や解放を表現するために使用されます。

以下は、”A”キーを押下し、その後解放するサンプルコードです。

using System.Runtime.InteropServices;
partial class MyForm : Form
{
    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
    private const byte KEY_A = 0x41; // "A"キーの仮想キーコード
    private const uint KEYEVENTF_KEYUP = 0x0002; // キー解放のフラグ
    public MyForm()
    {
        InitializeComponent();
    }
    private void SendKeyUsingKeybdEvent()
    {
        // "A"キーを押下
        keybd_event(KEY_A, 0, 0, UIntPtr.Zero);
        System.Threading.Thread.Sleep(100); // 少し待機
        // "A"キーを解放
        keybd_event(KEY_A, 0, KEYEVENTF_KEYUP, UIntPtr.Zero);
    }
}

このコードを実行すると、アクティブなウィンドウに”A”が入力されます。

SendInput関数の使用方法

SendInput関数は、複数の入力イベントを一度に送信するための関数です。

これにより、より複雑な入力シーケンスを簡単に実行できます。

以下は、”A”キーを押下し、解放するサンプルコードです。

using System.Runtime.InteropServices;
partial class MyForm : Form
{
    [DllImport("user32.dll")]
    private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
    [StructLayout(LayoutKind.Sequential)]
    public struct INPUT
    {
        public uint type;
        public KEYBDINPUT ki;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    private const uint INPUT_KEYBOARD = 1;
    private const ushort KEY_A = 0x41; // "A"キーの仮想キーコード
    private const uint KEYEVENTF_KEYUP = 0x0002; // キー解放のフラグ
    public MyForm()
    {
        InitializeComponent();
    }
    private void SendKeyUsingSendInput()
    {
        INPUT[] inputs = new INPUT[2];
        // "A"キー押下
        inputs[0].type = INPUT_KEYBOARD;
        inputs[0].ki.wVk = KEY_A;
        inputs[0].ki.dwFlags = 0;
        // "A"キー解放
        inputs[1].type = INPUT_KEYBOARD;
        inputs[1].ki.wVk = KEY_A;
        inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;
        // 入力を送信
        SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
    }
}

このコードを実行すると、アクティブなウィンドウに”A”が入力されます。

SendInputを使用することで、複数のキー入力を一度に送信することができ、より複雑な操作を簡単に実現できます。

以上のように、Windows APIを使用することで、C#プログラムからのキー入力の制御をより詳細に行うことが可能です。

Windows APIを使った応用例

Windows APIを使用することで、さまざまなアプリケーションでのキー入力のシミュレーションや自動化が可能になります。

ここでは、ゲームでのキー入力シミュレーション、非アクティブウィンドウへのキー送信、マクロ作成での利用について具体的な例を示します。

ゲームでのキー入力シミュレーション

ゲームでは、特定のキー入力を自動化することで、プレイヤーの操作を補助することができます。

以下は、ゲーム内で”スペース”キーを押下するサンプルコードです。

using System.Runtime.InteropServices;
partial class MyForm : Form
{
    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
    private const byte KEY_SPACE = 0x20; // スペースキーの仮想キーコード
    private const uint KEYEVENTF_KEYUP = 0x0002; // キー解放のフラグ
    public MyForm()
    {
        InitializeComponent();
    }
    private void SimulateSpaceKeyPress()
    {
        // スペースキーを押下
        keybd_event(KEY_SPACE, 0, 0, UIntPtr.Zero);
        System.Threading.Thread.Sleep(100); // 少し待機
        // スペースキーを解放
        keybd_event(KEY_SPACE, 0, KEYEVENTF_KEYUP, UIntPtr.Zero);
    }
}

このコードを実行すると、アクティブなゲームウィンドウにスペースキーが送信され、ジャンプやアクションを実行することができます。

非アクティブウィンドウへのキー送信

非アクティブなウィンドウに対してもキー入力を送信することができます。

これにより、バックグラウンドで動作しているアプリケーションに対しても操作を行うことが可能です。

以下は、メモ帳を非アクティブな状態で操作するサンプルコードです。

using System.Diagnostics;
using System.Runtime.InteropServices;
partial class MyForm : Form
{
    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
    private const byte KEY_A = 0x41; // "A"キーの仮想キーコード
    private const uint KEYEVENTF_KEYUP = 0x0002; // キー解放のフラグ
    public MyForm()
    {
        InitializeComponent();
    }
    private void SendKeysToInactiveWindow()
    {
        // メモ帳を起動
        Process notepad = Process.Start("notepad.exe");
        System.Threading.Thread.Sleep(1000); // メモ帳が起動するまで待機
        // メモ帳を非アクティブにする
        IntPtr hWnd = notepad.MainWindowHandle;
        SetForegroundWindow(hWnd); // ウィンドウを前面に持ってくる
        System.Threading.Thread.Sleep(500); // 少し待機
        SetForegroundWindow(IntPtr.Zero); // フォーカスを外す
        // "A"キーを送信
        keybd_event(KEY_A, 0, 0, UIntPtr.Zero);
        System.Threading.Thread.Sleep(100); // 少し待機
        keybd_event(KEY_A, 0, KEYEVENTF_KEYUP, UIntPtr.Zero);
    }
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);
}

このコードを実行すると、メモ帳が非アクティブな状態でも”A”が入力されます。

マクロ作成での利用

SendInputkeybd_eventを使用して、特定の操作を自動化するマクロを作成することができます。

以下は、特定のキー入力を連続して送信するマクロのサンプルコードです。

using System.Runtime.InteropServices;
partial class MyForm : Form
{
    [DllImport("user32.dll")]
    private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
    [StructLayout(LayoutKind.Sequential)]
    public struct INPUT
    {
        public uint type;
        public KEYBDINPUT ki;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    private const uint INPUT_KEYBOARD = 1;
    private const ushort KEY_A = 0x41; // "A"キーの仮想キーコード
    private const uint KEYEVENTF_KEYUP = 0x0002; // キー解放のフラグ
    public MyForm()
    {
        InitializeComponent();
    }
    private void CreateMacro()
    {
        INPUT[] inputs = new INPUT[4];
        // "A"キー押下
        inputs[0].type = INPUT_KEYBOARD;
        inputs[0].ki.wVk = KEY_A;
        inputs[0].ki.dwFlags = 0;
        // "A"キー解放
        inputs[1].type = INPUT_KEYBOARD;
        inputs[1].ki.wVk = KEY_A;
        inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;
        // "B"キー押下
        inputs[2].type = INPUT_KEYBOARD;
        inputs[2].ki.wVk = 0x42; // "B"キーの仮想キーコード
        inputs[2].ki.dwFlags = 0;
        // "B"キー解放
        inputs[3].type = INPUT_KEYBOARD;
        inputs[3].ki.wVk = 0x42; // "B"キーの仮想キーコード
        inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
        // 入力を送信
        SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
    }
}

このコードを実行すると、”A”と”B”が連続して入力されるマクロが実行されます。

これにより、特定の操作を自動化することができます。

以上のように、Windows APIを使用することで、ゲームや非アクティブウィンドウへの操作、マクロ作成など、さまざまな応用が可能です。

よくある質問

SendKeysクラスはどのような場合に使うべきですか?

SendKeysクラスは、以下のようなシンプルな自動化や操作のシミュレーションに適しています。

  • 簡単なテスト自動化: アプリケーションの基本的な操作を自動化する際に便利です。
  • ユーザーインターフェースの操作: ユーザーが行う操作をプログラムから再現したい場合に使用します。
  • 特定のアプリケーションとの連携: メモ帳やブラウザなど、特定のアプリケーションに対して簡単な入力を行う場合に適しています。

SendKeysクラスとWindows APIのどちらを選ぶべきですか?

SendKeysクラスとWindows APIの選択は、以下の要因によって異なります。

  • シンプルさ: 簡単な操作や少数のキー入力を送信する場合は、SendKeysクラスが簡単で使いやすいです。
  • 高度な制御: 複雑な入力シーケンスや非アクティブウィンドウへの入力が必要な場合は、Windows APIkeybd_eventSendInputを使用する方が適しています。
  • パフォーマンス: 大量のキー入力を送信する場合、Windows APIの方が効率的です。

SendKeysクラスが動作しない環境はありますか?

SendKeysクラスが動作しない場合、以下のような環境や状況が考えられます。

  • セキュリティ制限: 一部のアプリケーションや環境では、セキュリティ上の理由から外部からのキー入力を受け付けないことがあります。
  • フォーカスの問題: SendKeysはアクティブなウィンドウに対してのみ動作するため、対象のウィンドウがアクティブでない場合、入力が送信されません。
  • 特定のOSや環境: 一部のオペレーティングシステムや仮想環境では、SendKeysが正しく動作しないことがあります。

特に、リモートデスクトップや仮想マシン環境では注意が必要です。

まとめ

この記事では、C#におけるキー入力の送信方法について、SendKeysクラスやWindows APIを利用した具体的な手法を紹介しました。

これにより、アプリケーションの自動化や操作のシミュレーションがどのように行えるかを理解できたことでしょう。

今後は、これらの技術を活用して、より効率的なプログラムの開発や自動化スクリプトの作成に挑戦してみてください。

  • URLをコピーしました!
目次から探す