24 Nov 2014, 02:23

Ruby の win32ole で Windows GUI アプリのキー操作を自動化する

はじめに

Windows 上のアプリをキーボード操作で自動化したいと考えた.

Ruby の win32ole を利用すれば, 実現できそうなので, 調べた.

Win32ole とは

Windows 版の Ruby には, win32ole というライブラリがある.

これを利用すると, Ruby から Windows のいろいろなアプリを操作できる. (Excel,iExplore などなど…)

Windows アプリにキーを送ることができるので, キー操作で完結するアプリならば, 操作を自動化できる, というわけだ.

以前, Excel の操作で win32ole を利用した.以下, 過去記事参照.

今回は, キーボード操作関連の情報をまとめる.

WSHShell を操作

WSHShell とは, Windows のシェル. これを Ruby から制御する.手順は 2 つ.

  • あるウィンドウをアクティブにできる
  • アクティブなウィンドウにキーコードを送る

事前準備

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    以下の 2 行で, まずは wsh オブジェクト生成.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> require &#8216;win32ole&#8217;<br /> wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> [/sourcecode]
  </p>
</div>

プログラム起動

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    Run メソッドでプログラムを起動できる.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.Run (&#8216;notepad.exe&#8217;)<br /> [/sourcecode]
  </p>
</div>

ウィンドウをアクティブにする

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    AppActivate メソッドで ウィンドウをアクティブにできる.
  </p>

  <p>
    アプリのタイトルを指定する. 成功すると, ture が返る. 失敗すると, false が返る.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.AppActivate (&#8216;Title&#8217;)<br /> [/sourcecode]
  </p>
</div>

ウィンドウにキーコードを送る

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    SendKeys メソッドで ウィンドウにキーを送る.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.SendKeys (&#8216;A&#8217;)<br /> [/sourcecode]
  </p>

  <p>
    詳細な SendKey コードはここにある.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://msdn.microsoft.com/en-us/library/8c6yea83.aspx">SendKeys Method</a>
    </li>
  </ul>
</div>

Sample

notepad

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    メモ帳起動してなにか書く. Popup メソッドでメッセージ表示.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> require &#8216;win32ole&#8217;
  </p>

  <p>
    wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> wsh.Run (&#8216;notepad.exe&#8217;)<br /> wsh.AppActivate (&#8216;無題&#8217;)
  </p>

  <p>
    wsh.SendKeys (&#8216;Hello&#8217;)
  </p>

  <p>
    wsh.Popup (&#8216;Happy Hacking!!&#8217;)<br /> [/sourcecode]
  </p>
</div>

explorer

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    C:-neraフォルダをコピーして test2 フォルダを作成する.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> # coding: utf-8<br /> require &#8216;win32ole&#8217;
  </p>

  <p>
    wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> wsh.Run &#8216;explorer C:\Users\tsu-nera\Desktop&#8217;
  </p>

  <p>
    sleep (3)
  </p>

  <p>
    wsh.AppActivate (&#8216;Desktop&#8217;)
  </p>

  <p>
    # テストフォルダ選択<br /> wsh.SendKeys (&#8216;t&#8217;)
  </p>

  <p>
    sleep (0.5)
  </p>

  <p>
    # コピー & ペースト<br /> wsh.SendKeys (&#8216;^c^v&#8217;)
  </p>

  <p>
    sleep (0.5)
  </p>

  <p>
    # リーネム<br /> wsh.SendKeys (&#8216;{F2}test2{ENTER}&#8217;)
  </p>

  <p>
    # popup<br /> wsh.Popup (&#8216;Copy Success!!&#8217;)<br /> sleep (3)<br /> wsh.SendKeys (&#8216;{ENTER}&#8217;)<br /> [/sourcecode]
  </p>
</div>