java - 포함 - 캡처되지 않도록 창 건너 뛰기




jre 포함 배포 (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 )으로 설정하십시오.

두 개의 창이있는 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);

주 굴곡 창을 캡처하는 것을 원하지 않습니다. 캡처되지 않도록 (투명하게) 건너 뜁니다.

그것은 플렉스 프로젝트의 구성을 변경하여 가능합니까?

그것은 플렉스와 자바에서 할 수없는 경우, 그것은 어떤 플랫폼에서 할 수 있습니까?


내가 생각할 수있는 해결책은 캡처에서 "원치 않는"창을 이동할 수 있다는 것입니다. (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();




jna