RubyからWSHShellオブジェクトを使う
WSHShellオブジェクトはWindowsのShellを指すオブジェクトです。
WSHShellについての情報はMSのWshShellオブジェクトに載っています。
WSHShellオブジェクトを操作すると、以下のようなことができます。
- あるウィンドウをアクティブにできる
- アクティブなウィンドウにキーコードを送る
- ポップアップメッセージを表示
- レジストリの操作
アクティブなウィンドウにキーコードを送る
COMで制御できないアプリはキーコードを送って、動作を制御します。キーコードをアクティブウィンドウに送ると、 キーコードで指定されたキー操作を行ったのと同じ動作をします。
以下の例は、ノードパッド(メモ帳)を起動し、メモ帳にファイルを開かせるためのスクリプトです。
# sample_02.rb
require 'win32ole'
shell_obj = WIN32OLE.new("WScript.Shell")
shell_obj.run "notepad"
sleep 3
shell_obj.AppActivate("無題")
shell_obj.sendKeys("%fo")
sleep 0.5
shell_obj.sendKeys('c:\autoexec.bat{Enter}')
- WIN32OLE.new("WScript.Shell")で作ったのが、WSHShellオブジェクト
- runメソッドはプログラムの実行を指示します。[スタート/ファイル名を指定して実行]メニューでコマンドを打ち込むのと同じだろ うと思います。
- ノートパッドの場合、起動直後は「無題-メモ帳」というウィンドウタイトルになります
- shell_obj.AppActivate("無題")は「無題」で始まるウィンドウをアクティブにします。ここではノートパッドのウィンドウが アクティブになることを期待していますが、他にも「無題」で始まるウィンドウがあると、どのウィンドウがアクティブになるかは 不定です。
- shell_obj.sendKeys()で送っているのがキーコードです。ALTキーは"%"で示し、"%f"はALT+Fキーのキーコードです。この場合は、 "ALT+F+O"キーで、ファイルを開くメニュー操作になります。
- 次にファイル名をキーコードで指定して、最後にEnterキーを押すことで操作が完了します
- sleepで時間調整をうまくしないと、アプリ側がキーコードを取りこぼし、思ったとおりにならない場合が多いです
レジストリの操作
WSHShellオブジェクトを使うと、レジストリの操作もできます。 変更は怖いので、レジストリの読み出しをやってみましょう。
# sample_03.rb
require 'win32ole'
shell_obj = WIN32OLE.new("WScript.Shell")
key_val = shell_obj.RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProductID')
p key_val
これは見ただけでわかりますね。RegReadメソッドでキーを指定すれば、そのキーの値を返してくれます。
注意すべきは、指定したキーが無い場合は、例外が発生してしまうことです。キーがあるかどうか調べるメソッドがあると いいのに。もちろん、begin/rescueで例外を補足すればいいので、どうにでもなりますが。
ショートカットの操作
ショートカットを操作するときは、WshShellオブジェクトからWshShortcut オブジェクトを取得して、WshShortcut オブジェクト のメソッド使用します。
WshShortcut オブジェクトには以下のプロパティがあり、それぞれ、ショートカットの以下の場所に対応します。 変更後は、Saveメソッドで保存をショートカットに反映させます。
戻る