假设我想编程一个放大镜,我怎么能捕获屏幕的内容,不包括我自己的窗口? 我知道如何用我自己的窗口使用BitBlt和Desktop DC捕获屏幕。
为了更清楚一点:我想在窗口中放大放大的内容。
编辑:似乎没有其他的解决办法,比我隐藏我的窗口(或客户区)之前,我可以捕获我的窗口下的屏幕内容。 显然这导致我的窗口闪烁,这使得这个场景非常无用。
在捕获过程中,将AlphaBlend
属性的形式设置为true,将AlphaBlendValue
为0.请注意,这将使您的表单完全不可见。
您使用PrintWindow(),但它并不快,不适用于所有应用程序。
您需要从桌面的DC捕获屏幕截图到内存中的位图。
procedure CaptureScreenShot(acapture: TBitMap); var c: TCanvas; r: TRect; begin c:= TCanvas.Create; c.Handle:= GetWindowDC (GetDesktopWindow); try r:= Rect(0,0,screen.width,screen.height); acapture.Width:=screen.Width; acapture.Height:=screen.Height; acapture.Canvas.CopyRect(r, c, r); finally ReleaseDC(0, c.handle); c.Free; end; end;
加上Uwe的答案,使您的表单隐形,你有….
FCapturedScreenShot:TBitmap; .... FCapturedScreenShot:=TBitmap.Create; .... AlphaBlend:=true; AlphaBlendValue:=0; CaptureScreenshot(FCapturedScreenShot); AlphaBlendValue:=False;
使用捕获的屏幕截图,无论你需要什么,你可以通过另一种形式的位图分配,或保存在一个捕获屏幕的数组…
在捕捉屏幕之前尝试最小化或隐藏表单,并在捕捉屏幕后恢复或显示表单