2015-06-18 38 views
43

Utworzyłem aplikację AIR, która ma dwa okna. Pierwszym z nich jest okno główne (aplikacja z iskrowym oknem), a drugie to komponent (okno iskrowe). Używam Java do przechwytywania ekranu pulpitu za pomocą Flex-Java Bridge Flerry.Okno przechodzenia z przechwytywania

Oto kod do przechwytywania ekranu, który jest: -

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); 

Nie chcę się główne okno Flex do niewoli. Powinien zostać pominięty (przezroczysty) przed przechwyceniem.

Czy to możliwe, zmieniając konfigurację projektu flex?

Jeśli nie można tego zrobić w Flex i Java, w jakiej platformie można to zrobić?

+0

[ 'SetWindowDisplayAffinity'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd375340.aspx)' (hWnd, WDA_MONITOR); ' – IInspectable

+1

@iinspectable SetWindowDisplayAffinity nie pomija przechwyconego okna. Po prostu uchroni okno przed przechwyceniem. Nie chcę mieć czarnego ekranu w miejscu tego okna, chcę, żeby wyświetlał się jego tył okna. – Vishnu

+0

W jaki sposób ktoś powinien wiedzieć, czego chcesz, kiedy twoje pytanie nie określa w sposób zdalny pożądanego zachowania? To, o co prosiłeś w swoim komentarzu, jest - ogólnie rzecz biorąc - niemożliwe. – IInspectable

Odpowiedz

1

Jeśli dobrze zrozumiałem Twój problem.

można użyć funkcji zbudowany w Flex/as3 wziąć zrzut całej aplikacji lub konkretnego składnika następnie przekształcić ByteArray i PngEncoder (lub JPGEncoder jeśli wolisz), niż zapisać go ...

Oto przykład:

<?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:

Jak mi źle żądanie ..

Jedynym sposobem, można myśleć jest:

  1. zminimalizować stosowanie (this.minimize();) lub tworzeniu alfa 0 (this.alpha=0).
  2. Zrzut ekranu
  3. Zmaksymalizuj aplikację (this.maximize();) lub ustaw alfa na 1 (this.alpha=0).
+0

Przepraszamy. Chcę uchwycić ekran pulpitu, a nie elastyczną aplikację. – Vishnu

+0

Och ... do cholery ... źle zrozumiałem ... odpowiedź została zaktualizowana. – Marcx

+0

Powoduje to migotanie ekranu. Bitblt zajmuje 200 ms, aby uchwycić ekran. Próbowałem tego. I nie można użyć 'this.minimize' lub' this.alpha 'aplikacji flex w java – Vishnu

0

Rozwiązaniem, o którym mogę myśleć, jest to, że można przenosić "niechciane" okna poza przechwytywanie. (Poniżej 0,0 współrzędnych) z kodem podobnym do tego.

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

i od

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