自アプリ以外の背景取得、キャプチャーするには?


迷子  2013-09-24 17:08:47  No: 45327

迷子です!
よろしくお願いします!

フォームの透明や最小化は不可で、自分以外のソフトや背景をキャプチャーすることはできますか?

作ってみたのが、フォームを透明化させて、止めておいたtimer走らせて、キャプチャーして、timerを止めて、フォームを再表示してるんですが、時間と見映えが悪いので、スマートにする方法はありますか?
Timerにしたのは、残像が残るためです。
最前列から、キャプチャーソフト、メモ帳、背景があったら、キャプチャーソフト以外のすべてをキャプチャーしたいんです。

Windows2000で、D6です!


D  2013-09-25 05:02:22  No: 45328

フォームのAlphaBlendをTrueにしてコピー。
これだけ。

procedure TForm1.Button1Click(Sender: TObject);
var
  l_Desktop : HDC;
begin
  Image1.Picture.Bitmap.Width  := Screen.DesktopWidth;
  Image1.Picture.Bitmap.Height := Screen.DesktopHeight;

  l_Desktop := CreateDC('DISPLAY', nil, nil, nil);
  try
    //レイヤードウィンドウは第9引数にCAPTUREBLTを追加しないとコピーされないことを利用
    BitBlt(
      Image1.Picture.Bitmap.Canvas.Handle,
      0,
      0,
      Image1.Picture.Bitmap.Width,
      Image1.Picture.Bitmap.Height,
      l_Desktop,
      Screen.DesktopLeft,
      Screen.DesktopTop,
      SRCCOPY
    );

    Image1.Refresh;
  finally
    DeleteDC(l_Desktop);
  end;
end;

AlphaBlendをTrueにすることでフォームはレイヤードウィンドウになります。
そしてBitBlt APIは第9引数にCAPTUREBLTを追加しないとレイヤードウィンドウをコピーできません。

ということで、このやり方で自身以外をキャプチャすることが可能なのですが、他のソフトがレイヤードウィンドウであった場合に対応できない欠点があります。
(他にレイヤードウィンドウのアプリがあった場合そのアプリもコピーされない)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加