(株)タックテック TACKTECH,INC.


top > labo > Ajaxその1


Ajaxその1 リモートコントロールソフトの作成 (3)


開発中に困った事、はまった事
■ Javaでカーソルイメージを取得

 WebMonitorではスクリーンのイメージにマウスカーソルも含める事ができます。
 これにはキャプチャしたスクリーンイメージに現在のカーソルイメージを描画する必要があります。
 ここで困ったのは現在のカーソルイメージを取得する方法が見つからないのです。
 マウスのエミュレートなどはjava.awt.Robotクラスで可能なのですが現在状態を取得する方法が結局つかりませんでした。
 動作環境の制限を避けるためにもJNIは使いたくなかったのですが断念してしまいました。
 従ってWebMonitorは現在のところWindowsPCのモニタしかできません。

■ ウインドウステーション/デスクトップ

 これははまりました。
 WebMonitorのサーブレット版はEclipse(WTP)上の「動的Webアプリケーション」で開発しています。
 Eclipse上の「サーバでデバッグ」から実行しながらデバッグをしていたのですが、いざTomcatにデプロイして動作させると
 スクリーンビューが真っ黒になるのです。
 しかもマウスやキーボードのエミュレートも動かない。
 例外も出ていないしEclipse上だと問題なく動くし...。

 何が違う??? 違うのはサーバの実行方法だけです。
 そうです。そうなんです。
 Eclipse(WTP)上で起動するTomcatは「サービス」ではないのです。
 Windowsの場合、通常のTomcatはサービスとして動いています。 この違いなんですね。
 ではサービスの場合どうしてビューが真っ黒になるのでしょう?
 これはサービスとして動いているTomcat上のデスクトップ環境は目に見えているデスクトップとは違うからです。
 通常スクリーンショットを行うプログラムはWin32APIのGetDesktopWindow()等でデスクトップのウインドウハンドルを取得して
 そのハンドルからイメージを取得します。
 このGetDesktopWindow()はカレントプロセスのデスクトップウインドウを返します。
 つまりサービス上のプログラムでは目に見えている通常のデスクトップではなくサービスプロセスのデスクトップを返します。
 という事でWebMonitorはTomcatサービスのデスクトップ(真っ黒)をモニタリングしていた訳です。
 マウスやキーボードのエミュレートもこのデスクトップの問題が原因です。

 そこで修正です。
 デスクトップのキャプチャやマウス、キーボードのエミュレート前にプロセスとスレッドのウインドウステーションとデスクトップを
 デフォルト(通常目に見えている)の環境にスイッチします。
 このためのAPIとして次のようなものを使用します。

  ・OpenWindowStation
  ・OpenDesktop
  ・CloseWindowStation
  ・CloseDesktop
  ・GetProcessWindowStation
  ・GetThreadDesktop
  ・SetProcessWindowStation
  ・SetThreadDesktop

WebMonitorで使ったデスクトップ環境をスイッチするクラスを参考までに公開します。※ダウンロードは、こちら
クラス名はCDefaultDesktopです。
使い方は簡単です。次の例のように処理関数の先頭で本クラスを生成するだけです。
関数(スコープ)を抜けると元のデスクトップ環境に戻ります。

  void func() {
      // デフォルトデスクトップにスイッチ
      CDefaultDesktop desktop;
      
      // スクリーンキャプチャやマウス、キーボードのエミュレート等
      GetDesktopWindow();
      mouse_event(...);
      keybd_event(...);
      ...
  }
  


■ クロスブラウザ

 やっぱり苦労します。
 実験ということもありprototype.js等のライブラリは使用しませんでした。
 特にイベント処理には疲れました。


感想など
Ajaxで面白いものはできないかとWebMonitorを作成してきました。
実用を考えればログインの認証機能の追加やもう少しレスポンスを上げる必要があると思います。
とは言うもののプラグイン無しでそれなりに期待するプログラムが完成しました。これもAjaxの力です。

最近では驚くようなアプリケーションがブラウザ上で動いています。 Ajaxのもつパフォーマンスの証です。
この動きはどこまで進むのでしょうか?

なにもかもブラウザ上で動かす必要は全く無いとは思いますが、この流れは当分とまりそうにありません。
タックテックもAjax技術をどんどん取り入れて「おおっ」といわれる一味違ったシステムを開発したいと考えています。


前のページ   実験室のTOP

 

©2006 TackTech,Inc.