[C#] キー入力をプログラムから送信する方法
C#でプログラムからキー入力を送信するには、SendKeysクラス
を使用する方法があります。
System.Windows.Forms
名前空間に含まれるこのクラスは、アクティブなウィンドウにキー入力をシミュレートして送信します。
例えば、SendKeys.Send("A")
を使用すると、アクティブなウィンドウに A
キーが押されたことをシミュレートできます。
ただし、SendKeys
はフォーカスのあるウィンドウにしか送信できないため、他のアプリケーションにキー入力を送信する場合は、ウィンドウをアクティブにする必要があります。
また、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_event
やSendInput
といった関数が利用されます。
これらの関数を使用することで、より精密なキー入力のシミュレーションが可能になります。
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”が入力されます。
マクロ作成での利用
SendInput
やkeybd_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を使用することで、ゲームや非アクティブウィンドウへの操作、マクロ作成など、さまざまな応用が可能です。
まとめ
この記事では、C#におけるキー入力の送信方法について、SendKeysクラス
やWindows APIを利用した具体的な手法を紹介しました。
これにより、アプリケーションの自動化や操作のシミュレーションがどのように行えるかを理解できたことでしょう。
今後は、これらの技術を活用して、より効率的なプログラムの開発や自動化スクリプトの作成に挑戦してみてください。