【问题标题】:How can I capture screen under my own window excluding my own window如何在我自己的窗口下捕获屏幕,不包括我自己的窗口
【发布时间】:2011-09-23 15:30:10
【问题描述】:

假设我想对放大镜进行编程,我如何捕捉屏幕内容,不包括我自己的窗口? 我知道如何使用 BitBlt 和 Desktop DC 在我自己的窗口中捕获屏幕。

为了更清楚:我想在我的窗口中显示放大的内容。

编辑:似乎没有其他解决方案,只能以一种或另一种方式隐藏我的窗口(或客户区),然后才能捕获窗口下的屏幕内容。显然,这会导致我的窗口闪烁,从而使这种情况变得毫无用处。

【问题讨论】:

  • 我会在网络上搜索执行此操作的开源代码,看看他们是如何做到的
  • @David,考虑到可能有很多放大镜实现,我只是有同样的想法进行网络搜索,而且他们一定以某种方式解决了这个问题。
  • 如果这很容易做到,我会感到惊讶。是什么让您认为 Windows 会跟踪其他窗口下方的窗口中显示的内容?
  • 主题的任何解决方案?

标签: windows delphi


【解决方案1】:

在捕获过程中,将表单 AlphaBlend 属性设置为 true,将 AlphaBlendValue 设置为 0。请注意,这会使您的表单完全不可见。

【讨论】:

  • 感谢 Uwe,不幸的是,这会导致我的窗口闪烁(例如,在计时器事件中完成时)。所以考虑到我原来的场景(放大镜),这真的行不通。
  • 如果您将 AlphaBlendValue 设置为略低于最大值,这将强制 Windows 在窗口下方呈现内容,但仍使窗口几乎保持不变。问题是如何捕捉下面的部分?
【解决方案2】:

您为此使用 PrintWindow(),但速度不快,并且不适用于所有应用程序。

【讨论】:

  • 迈克,我不想捕捉我自己的窗口,但我自己的窗口下面是什么。
  • @iamjoosy,首先找到您自己窗口下的窗口,然后使用该 HWND 调用 PrintWindow。他是对的,无论它是否有效,都会受到打击。
  • @Mark,但我自己的窗口下可能不是只有一个窗口,而是很多,部分重叠,或者只是桌面。请记住我的问题,我想做的是放大镜,它可以放大我窗下的任何东西。
  • @iamjoosy,如果不可能的话,你想要什么是无关紧要的。在这种情况下,它可能是,你将不得不接受一个不太完美的解决方案,这就是其中之一。祝你好运。
【解决方案3】:

您需要从桌面的 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; 

根据需要使用捕获的屏幕截图,您可以将其分配到另一种形式的位图上,或者将其保存在捕获的屏幕数组中...

【讨论】:

  • 谢谢 PA。请注意,我不想捕获整个屏幕。我编辑了我的问题以使其更清楚。此外,Uwe 的解决方案并没有真正起作用,因为这会导致我的窗口闪烁。
  • @iamjoosy,只需捕获整个桌面并在放大镜窗口下切出矩形。
【解决方案4】:

在截屏前尝试最小化或隐藏表单,在截屏后恢复或显示表单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2013-02-17
    • 2014-10-19
    相关资源
    最近更新 更多