Written in Japanese(UTF-8)
2006. 3. 2
INASOFT
/トップ/ユーティリティとゲーム/キーボードシミュレータ/作ってみよう

キーボードシミュレータ / keybd_event APIについて / C++ / C# / VB.NET / J# / C++.NET

Icon キーボードシミュレータを作ってみよう!!


キーボードシミュレータの簡単なコマンドライン版を作ってみようという、プログラミング解説講座です。
ListView to CSVを作ってみよう」のキーボードシミュレータ版みたいなものです。

第1回

解説ページ←   →第2回へ


■キーボードシミュレータとは?

クリップボードに対応していないソフトウェアに、他のソフトからの情報を貼り付けたくなることはないでしょうか。作者は、あるバイナリファイル編集ソフトを用いているとき、クリップボードに未対応であることで、とても使いづらく感じたことがありました。

キーボードシミュレータは、キーボード入力をシミュレートすることにより、上記のようなソフトウェアに対する問題の解決を試みます。

このプログラムが採用している方式は、Win32APIの keybd_event() を呼び出し、キーボードの動作をシミュレートするというものです。

このプログラムを起動すると、ダイアログが表示され、そこに文字列を入力できる状態になります。もちろん、クリップボードにも対応しています。[OK]をクリックすると、数秒のウェイトの後、入力された内容に従ったキーボードシミュレートを開始します。これにより、クリップボードを介さない情報のコピーを実現します。

詳しくは、解説ページを参照してください。

■どういう方法で行うか?

先ほど項でも少し触れたとおり、keybd_event() というWin32 APIを使います。これは、Windows上で動作しているアプリケーションに対し、キーボードの入力があったかのように思わせるためのAPIです。MSDNの説明のページはこちらです。


VOID keybd_event(
  BYTE bVk,               // 仮想キーコード
  BYTE bScan,             // ハードウェアスキャンコード
  DWORD dwFlags,          // 関数のオプション
  ULONG_PTR dwExtraInfo   // 追加のキーストロークデータ
);

先ほどは「キーボードの入力があったかのように思わせる」と書きましたが、実際にはキーボードドライバもこのAPIを呼び出しています。システムはこの情報から、WM_KEYUPWM_KEYDOWN メッセージを生成します。

[引数の解説]

bVk … 仮想キーコードを指定します。
bScan … 使用しません。
dwFlags … 関数の動作を指定します。次のフラグを組み合わせて指定します。
 KEYEVENTF_EXTENDEDKEY(1) … このフラグをセットすると、スキャンコードにプリフィックスバイト 0xE0(224)を追加します。
 KEYEVENTF_KEYUP(2) … このフラグをセットすると、キーを離す操作になります。セットしない場合、キーを押す操作になります。
dwExtraInfo … 省略。

キーボードのキーを押したり、離したりといった動作を行い、イベントを発生させます。MSDNライブラリによれば、画面のスナップショットを取得してクリップボードに記憶させるために、[PrintScreen]キーの押し下げをシミュレートすることもできるそうです。このような操作を行うには、bVkVK_SNAPSHOTに設定して、keybd_eventを呼び出します。

■keybd_event() のサンプル

Aキーの押下を行うには、次のようにします。



      // Aキーの押し下げをシミュレートする。
      keybd_event( 'A', 0, 0, 0 );

      // Aキーの解放をシミュレートする。
      keybd_event( 'A', 0, KEYEVENTF_KEYUP, 0);

Enterキーの押下を行うには、次のようにします。



      // リターンキーの押し下げをシミュレートする。
      keybd_event( VK_RETURN, 0, 0, 0 );

      // リターンキーの解放をシミュレートする。
      keybd_event( VK_RETURN, 0, KEYEVENTF_KEYUP, 0);

Shiftキーを押しながらBキーを押すには、次のようにします。



      // Shiftキーの押し下げをシミュレートする。
      keybd_event( VK_SHIFT, 0, 0, 0 );
      // Bキーの押し下げをシミュレートする。
      keybd_event( 'B', 0, 0, 0 );
      // Bキーの解放をシミュレートする。
      keybd_event( 'B', 0, KEYEVENTF_KEYUP, 0);
      // SHIFTキーの解放をシミュレートする。
      keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

■次回は?

次回は、C++言語を用いて、キーボードシミュレータのコマンドライン版を作ってみます。

解説ページへ←   →第2回へ


キーボードシミュレータ / keybd_event APIについて / C++ / C# / VB.NET / J# / C++.NET
/トップ/ユーティリティとゲーム/キーボードシミュレータ/作ってみよう