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

Я создал приложение 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 и java, на какой платформе это можно сделать?

2 ответа

Если я правильно понял вашу проблему.

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

Решение, которое я могу придумать, состоит в том, что вы можете переместить "нежелательные" окна из захвата. (Ниже 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();
Другие вопросы по тегам