Windows仮想キーイベント

By:
April 11, 2022

Windows端末を使っているときに仮想キーコードのイベントを発火し、疑似的にキーを入力したようにするAPI keybd_event()についてのメモ.

キーボードシミュレータを作ってみよう#1
キーボードシミュレータ / keybd_event APIについて / C++ / C# / VB.NET / J# / C++.NET キーボードシミュレータの簡単なコマンドライン版を作ってみようという、プログラミング解説講座です。 「ListView to CSVを作ってみよう」のキーボードシミュレータ版みたいなものです。 クリップボードに対応していないソフトウェアに、他のソフトからの情報を貼り付けたくなることはないでしょうか。作者は、あるバイナリファイル編集ソフトを用いているとき、クリップボードに未対応であることで、とても使いづらく感じたことがありました。 キーボードシミュレータは、 キーボード入力をシミュレート することにより、上記のようなソフトウェアに対する問題の解決を試みます。 このプログラムが採用している方式は、Win32APIの keybd_event() を呼び出し、キーボードの動作をシミュレートするというものです。 このプログラムを起動すると、ダイアログが表示され、そこに文字列を入力できる状態になります。もちろん、クリップボードにも対応しています。[OK]をクリックすると、数秒のウェイトの後、入力された内容に従ったキーボードシミュレートを開始します。これにより、クリップボードを介さない情報のコピーを実現します。 詳しくは、 解説ページ を参照してください。 先ほど項でも少し触れたとおり、 keybd_event() というWin32 APIを使います。これは、Windows上で動作しているアプリケーションに対し、キーボードの入力があったかのように思わせるためのAPIです。MSDNの説明のページは こちら です。 先ほどは「キーボードの入力があったかのように思わせる」と書きましたが、実際にはキーボードドライバもこのAPIを呼び出しています。システムはこの情報から、 WM_KEYUP や WM_KEYDOWN メッセージを生成します。 [引数の解説] bVk ... 仮想キーコードを指定します。 bScan ... 使用しません。 dwFlags ...

↓に簡単なサンプルクラスを配置。

using System.Runtime.InteropServices;

namespace Sample
{
	public static class Win32Api
	{
		// keybd_event()の呼び出し、win32apiを利用する.
		[DllImport("user32.dll")]
    private static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

		// キーの押上.
    private static uint KEYEVENT_KEYUP => 0x0002;
		
		// 仮想キー、0
		public static byte VK_0 => 0x30;


		/// <summary>
    /// 指定した仮想キーコードのキーを押下 -> 押上 処理を行う.
    /// </summary>
    /// <param name="keycode"></param>
    public static void KeyBoardEvent(byte keycode)
    {
        keybd_event(keycode, 0, 0, 0);
        keybd_event(keycode, 0, Win32Api.KEYEVENT_KEYUP, 0);
    }
	}
}

基本的に押下と押上のイベントはペアで扱うのが無難。

// 指定したキーコードのキーを押下したイベントを発火する.
keybd_event(keycode, 0, 0, 0);

// 指定したキーコードのキーを押上したイベントを発火する.
keybd_event(keycode, 0, Win32Api.KEYEVENT_KEYUP, 0);

後でGistかなんかにメモを記述しておく