Пропустить окно из захваченного
Я создал приложение 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>
РЕДАКТИРОВАТЬ:
Как я думал, я неправильно понял просьбу..
Единственный способ, о котором я могу думать, это:
- Свернуть приложение (
this.minimize();
) или установка альфа на 0 (this.alpha=0
). - Сделать скриншот
- Развернуть приложение (
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();