開発じたばた日誌

前へ●●●次へ
じたばた日誌目次へ戻る
TSUCHY Softへ戻る


Control Capture そうは問屋がおろさない編

 どんなツールを作るのにも、必ず壁があります。今回の壁はキャプチャするということです。 キャプチャツールを作ろうと思っているのに、肝心なキャプチャの方法を知らないとは無謀な試みです。

 たーしか、キャプチャの実行にはAPIのBilBlt(ビットブリットと読むらしい)を使ったはずです。 この関数はパラメータがたくさんありますが、難しいのはHWNDという「このウィンドウ」と指し示す値を得ることくらいです。 あとは、キャプチャしたいウィンドウが持っているボタンなどのコントロールの座標を記憶しておくぐらいです。

 実験するとうまくいきます。いろんなコントロールがのっかっていても、指定すればそれだけを取り出してくれます。 珍しくうまくいったな、と思ったらやはり問題が発生しました。

 キャプチャツール全般に言えるのですが、取り込みたいウィンドウがスクリーンからはみ出ていたり、そのウィンドウの 上に別のウィンドウが見えていると、ほしいウィンドウの画像がきちんととりこまれません。はみ出ているときははみ出た部分が ぐちゃぐちゃになるし、上に別のウィンドウがある時は、そのウィンドウがそのまま取り込まれます。

 さらに笑えることに、Control Captureが目的のウィンドウの上にあると、Control Capture自身がキャプチャされます。 自分で自分の邪魔をしているのです。これを回避するため、ほかのアプリはどんなことをしているでしょうか?

 キャプチャするアプリでは、たいてい最小化しています。そしておもむろに元に戻ります。 Control Captureでは最小化なんて面倒だから(どうして面倒なのか自分でも不思議)、キャプチャする前に自分を見えなくして その後キャプチャし、おもむろに見えるようにする方法をとりました。

 ところがこの方法はいつもうまくいくとは限りません。 自分が見えなくなっても下(目的の)のウィンドウにはControlCaptureの残像があるのです。 下のウィンドウは、ControlCaptureによって隠されていた部分を自分で一生懸命に再表示しないといけません。 その再表示のヒマが与えられないうちにキャプチャしてしまうと、残像が残ったままの画像を取り込んでしまうのです。

 じゃあ、どれだけの時間をおいてキャプチャすればいいのでしょう?1秒でしょうか。 これはいつもうまくいくとは限りません。10秒でしょうか。99.8%以上の確率でうまくいくでしょう。 でもこれではユーザーに怒られてしまいます。ControlCaptureはこの辺はテキトーです。ごめんなさい。 ようはControl Captureが目的のウィンドウを隠さないようにすればいいのです。