あるソフトの画面中のある小さな部分が、状況によって色が変わります。
具体的には、ランプの絵が、システムが正常なら緑、異常なら赤になります。
そこで、このアプリ上のランプの位置の色を取得して、システムの状況を
常時監視したいと思っています。
こういった場合、アプリの、又は画面全体のキャプチャを行って、Bitmapを
作成し、ランプの位置の色を取得すれば良いと思いますが、ランプの大きさは
16×16ピクセル程度ですので、この部分だけのキャプチャを行えば効率はいいし、
システムにも負担は掛けなくて済むと思っております。
こういった、ある場所だけのキャプチャって出来ますでしょうか?
そのソフトが常に位置固定で再前面ならば、GetPixelでイケル
もし、最前面でない場合で位置固定なら そのランプの位置に他のウィンドウが重ねっていないという前提ならば デスクトップのキャプチャをしてそこから CopyRectを使えばできますねw
もしくは アスさんが言われているソフトのウィンドウハンドルを取得してそこからランプの相対位置を計算して その部分だけをキャプチャーし続ければ ソフトのウィンドウが移動しても常にキャプチャーできますよ♪
前提条件さん、ありがとうございます。
以下のようにやってできました。
DispDC := CreateDC('DISPLAY', nil, nil, nil);
try
Clr := GetPixel(DispDC, 100, 100);
finally
DeleteDC(DispDC);
end;
1回のキャプチャが約4ms位でしたので、負担を掛けずにできそうです。
カレーライズさんの方法ですが、一旦デスクトップ全体、若しくは
対象ウィンドウのキャプチャを行ってから、欲しい部分のCopyRectを
行うようになると思うのですが、これだとシステムに負担を掛けそうなんですが、
どうなんでしょうか?(まだ試しては無いのですが・・・)
CopyRectって言ってるのだから。
「デスクトップのキャプチャ」てのがデバイスコンテキストのハンドル取得の事でしょう。1pixcelでないならBitBltの方が簡単で早い気がします。
たしかにCopyRect()では 少し負担がかかるかも。でも 最終的には常時監視したいと言われている タイマーの間隔をさほど大きくしなかったら問題ないのでは・・・
> Clr := GetPixel(DispDC, 100, 100);
上記の方法でできた言われていることは、初めから16*16Pixelを内の1Pixelを調べたかったのでしょうか??なら 絶対にGetPixelが速いですよ。わたしは16*16のサイズを常にキャプチャーし続けたいのかと思っていたのですが。
ツイート | ![]() |