■ 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等のライブラリは使用しませんでした。
特にイベント処理には疲れました。
©2006 TackTech,Inc.