Подтвердить что ты не робот

Пропустить окно от захвата

Я создал приложение AIR, которое имеет два окна. Первый - основное окно (искровое оконное приложение), а второе - компонент (искровое окно). Я использую 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 было захвачено. Он должен пропускаться (прозрачным) от захвата.

Возможно ли это, изменив конфигурацию проекта flex?

Если это невозможно сделать в flex и java, на какой платформе это можно сделать?

4b9b3361

Ответ 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>

EDIT:

Как я думал, я неправильно понял просьбу.

Единственный способ, о котором я могу думать, это:

  • Сведите к минимуму приложение (this.minimize();) или установите альфа в 0 (this.alpha=0).
  • Сделайте снимок экрана
  • Разверните приложение (this.maximize();) или установите альфа в 1 (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();