クリップボードに対応していないソフトウェアに、他のソフトからの情報を貼り付けたくなることはないでしょうか。作者は、あるバイナリファイル編集ソフトを用いているとき、クリップボードに未対応であることで、とても使いづらく感じたことがありました。
キーボードシミュレータは、キーボード入力をシミュレートすることにより、上記のようなソフトウェアに対する問題の解決を試みます。
このプログラムが採用している方式は、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_KEYUP や WM_KEYDOWN メッセージを生成します。
[引数の解説]
bVk … 仮想キーコードを指定します。
bScan … 使用しません。
dwFlags … 関数の動作を指定します。次のフラグを組み合わせて指定します。
KEYEVENTF_EXTENDEDKEY(1) … このフラグをセットすると、スキャンコードにプリフィックスバイト 0xE0(224)を追加します。
KEYEVENTF_KEYUP(2) … このフラグをセットすると、キーを離す操作になります。セットしない場合、キーを押す操作になります。
dwExtraInfo … 省略。
キーボードのキーを押したり、離したりといった動作を行い、イベントを発生させます。MSDNライブラリによれば、画面のスナップショットを取得してクリップボードに記憶させるために、[PrintScreen]キーの押し下げをシミュレートすることもできるそうです。このような操作を行うには、bVkをVK_SNAPSHOTに設定して、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++言語を用いて、キーボードシミュレータのコマンドライン版を作ってみます。