如何抓取当前窗口覆盖下的屏幕 ( 积分: 100 )

  • 主题发起人 主题发起人 tomjerry
  • 开始时间 开始时间
T

tomjerry

Unregistered / Unconfirmed
GUEST, unregistred user!
如何抓取当前窗口覆盖下的屏幕[?][?]
 
把覆盖的窗口完全透明看看,或者把要抓的窗口完全透明并放到前面(不影响后面的操作).
 
覆盖部分windows根本就没帮你画出来,所以也不可能截得到图
 
覆盖了说明没有画出出来吧 所以也没办法抓取到
 
先把当前窗口覆盖下的屏幕显示出来,再截图
 
1.用函数showwindow(当前窗口.handle,SW_MINIMIZE)
2.戴取你的图
3.用函数showwindow(当前窗口.handle,SW_RESTORE)
 
看来还是作透明窗体了。
是否有作透明窗体的控件?要求窗体透明,但窗体内的控件不能透明。
或者有什么实现方法?
 
如果是Windows2000以后的GDI是分层的.可以用如下办法抓取.
procedure GetScreen(AfterWnd : HWND;img : TImage);
const
WS_EX_LAYERED = $00080000;
var
DC: HDC;
FStyle: Longint;
FCanvas: TCanvas;
bmpScreen : TBitmap;

R:TRect;
begin
AfterWnd := GetActiveWindow;
FStyle := GetWindowLong(AfterWnd, GWL_EXSTYLE);
FStyle := FStyle or WS_EX_LAYERED;
SetWindowLong(AfterWnd, GWL_EXSTYLE, FStyle);
Sleep(50);
bmpScreen := TBitmap.Create;
GetWindowRect(AfterWnd, R);
bmpScreen.Width := R.Right - R.Left;
bmpScreen.Height := R.Bottom - R.Top;
bmpScreen.Canvas.Lock;
DC := GetDC(0);
with bmpScreen do
Bitblt(Canvas.Handle, 0, 0,
R.Right - R.Left, R.Bottom - R.Top,
DC, R.Left, R.Top, SRCCOPY);


FStyle := GetWindowLong(AfterWnd, GWL_EXSTYLE);
FStyle := FStyle and (not WS_EX_LAYERED);
SetWindowLong(AfterWnd, GWL_EXSTYLE, FStyle);
img.Canvas.CopyRect(Rect(0,0,bmpScreen.Width,bmpScreen.Height),
bmpScreen.Canvas,
Rect(0,0,bmpScreen.Width, bmpScreen.Height));
ReleaseDC(0, DC);
bmpScreen.Canvas.UnLock;
bmpScreen.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetScreen(Self.Handle,Image1);
end;
 
刚才的代码有点问题,又修改了一下上面的帖子
 
谢谢wr960204
 
后退
顶部