Windowsスクリーンショット撮影サーバをdRubyで作って、Macから呼んでみる。

以下の手順であっけなく、MacWindowsのデスクトップ画像を取得できました。が、Parallelsの解像度はXGA,SXGA等の規格に沿ったものでないと撮影に失敗する模様。

1.WindowsRubyに「Win32screenshot」を入れる。

C:\>gem install win32screenshot -y

2.撮影用サーバをdRubyで書く。

RMagickを入れてPNGに変換しようかしらと思ったが、撮影用の小さなアプリにそれは大げさすぎ。ネットを徘徊していてよいエントリを発見。
http://info.skypeint.net/?eid=169993
なるほど。ZLibを使って圧縮だけして加工は取ってきてからすれば良しと。
というわけで以下のようなサーバを作成。

require 'rubygems'
require 'win32screenshot'
require 'zlib'
require 'drb/drb'

class ScreenShot
  def initialize(stream=$stdout)
    @stream = stream
  end

  def shot
    width, height, data = Win32::Screenshot.desktop
    #File.open("screenshot.bmp", "wb") { |io| io.write(data) }
    compression = Zlib::Deflate.deflate(data)
    @stream.puts "Shot! #{width}, #{height}"
    return compression
  end
end

uri = ARGV.shift
DRb.start_service(uri, ScreenShot.new)
puts DRb.uri
sleep

3.クライアントコードを書く。

取ってきた圧縮データを展開してBMP形式で保存するだけ。

require 'drb/drb'
require 'zlib'

scrshot = DRbObject.new_with_uri ARGV.shift
compbmp = scrshot.shot
bitmap = Zlib::Inflate.inflate(compbmp)
File.open('shot.bmp', 'wb') { |io| io.write bitmap }

4.実行してみる。

  1. Windows側でサーバを実行。
  2. Mac側でクライアントを実行。引数にはサーバ実行時に表示されたURIを指定。
  3. Mac側に作成される「shot.bmp」を開いて、Windows側のデスクトップ画像が表示されることを確認。


OSXのプレビューで表示してみました。

5.まとめ

実にあっけなく動きました。こりゃおもしろい。
会社で蠢いてるマシンの監視に使える手法だろうか。Railsと組み合わせて、沢山ある共有の開発用PCの状況監視とか状態制御とか。
C#で作るよりは手軽かな? Win32API使えばいろいろ出来るわけだし。