跳过被捕获的窗口

2022-09-01 01:40:56

我创建了一个具有两个窗口的AIR应用程序。第一个是主窗口(spark Windowed Application),第二个是组件(spark窗口)。我正在使用Java来捕获Flex-Java Bridge Flerry的桌面屏幕。

以下是捕获屏幕的代码,它是:

HDC hdcWindow = User32.INSTANCE.GetDC(hWnd);
HDC hdcMemDC = GDI32.INSTANCE.CreateCompatibleDC(hdcWindow);
RECT bounds = new RECT();
User32Extra.INSTANCE.GetClientRect(hWnd, bounds);

int width = bounds.right;
int height = bounds.bottom ;
HBITMAP hBitmap = GDI32.INSTANCE.CreateCompatibleBitmap(hdcWindow, width, height);

HANDLE hOld = GDI32.INSTANCE.SelectObject(hdcMemDC, hBitmap);
GDI32Extra.INSTANCE.BitBlt(hdcMemDC, 0, 0, width, height, hdcWindow, 0, 0, WinGDIExtra.SRCCOPY);

我不希望捕获主柔性窗口。它应该跳过(透明)从捕获。

通过更改弹性项目的配置是否可以实现?

如果它不能在flex和java中完成,那么可以在什么平台上完成呢?


答案 1

如果我正确地理解了你的问题。

您可以使用内置的Flex / as3函数来截取整个应用程序或特定组件的屏幕截图,然后转换为bytearray和PngEncoder(如果您愿意,也可以转换为JPGEncoder),而不是保存它...

下面是一个示例:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx">   
    <fx:Script>
        <![CDATA[
            import mx.graphics.codec.PNGEncoder;

            private function takeSnapshot(comp:DisplayObject):void {
                var bitmapData:BitmapData = new BitmapData(comp.width,comp.height,false,0x00000000);
                bitmapData.draw(comp, new Matrix());

                var fileStream:FileStream = new FileStream();
                fileStream.open(File.desktopDirectory.resolvePath("screenshot.png"), FileMode.UPDATE);
                fileStream.writeBytes(new PNGEncoder().encode(bitmapData));
            }
        ]]>
    </fx:Script>    
    <s:BorderContainer width="100%" height="100%" backgroundColor="#ff00ff">
        <s:Label text="this text and box should be saved"/>
        <s:BorderContainer width="25%" height="25%" backgroundColor="#ffff00" horizontalCenter="0"
                           id="extended"
                           verticalCenter="0">
            <s:Label text="this text and box should be saved" width="100%" maxDisplayedLines="5"/>
        </s:BorderContainer>
    </s:BorderContainer>    
    <s:Button bottom="0" left="0" label="screen" click="takeSnapshot(extended)"/>
</s:WindowedApplication>

编辑:

因为我认为我误解了这个要求。

我能想到的唯一方法是:

  1. 最小化应用程序 () 或将 alpha 设置为 0 ()。this.minimize();this.alpha=0
  2. 截取屏幕截图
  3. 最大化应用程序 () 或将 alpha 设置为 1 ()。this.maximize();this.alpha=0

答案 2

我能想到的一个解决方案是,你可以把“不需要的”窗口移出捕获的样子。(低于 0,0 坐标)带有一些类似这样的代码。

public void foo(){
this.xCoord = -this.xCoord;
this.yCoord = -this.yCoord;
}   
//Im not sure about the exact syntax but you should get the idea.

和比

foo();
capture();
foo();

推荐