2015-06-18 23 views
43

İki pencereye sahip bir AIR uygulaması oluşturdum. Birincisi ana penceredir (kıvılcımlı Pencereli Uygulama), ikincisi ise bir bileşen (kıvılcım penceresi). Masaüstü ekranını Flex-Java Bridge Flerry ile yakalamak için Java kullanıyorum. İşte Pencereyi yakalama penceresinden atla

olan ekran yakalamak için kod şudur: - Ben ana esnek pencere yakalanabilir istemiyoruz

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

. Yakalanmaktan (saydam) atlanmalıdır.

Bu esnek projenin yapılandırması değiştirilerek mümkün mü?

Esnek ve javada yapılamazsa, hangi platformda yapılabilir?

+0

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

+1

@iinspectable SetWindowDisplayAffinity, pencerenin yakalanmasını engellemez. Sadece pencerenin yakalanmasını engeller. Bu pencerenin yerine siyah ekran istemiyorum, pencerenin arka tarafının görüntülenmesini istiyorum. – Vishnu

+0

Sorunuz, istediğiniz davranışı uzaktan belirlemediğinde bile, ne istediğinizi bilmek ister? Yorumunuzda sorulan şey genel olarak mümkün değil. – IInspectable

cevap

1

Sorununuzu doğru olarak anladıysam.

Sen kaydetmek yerine, (ya da tercih ederseniz JPGEncoder) daha sonra ByteArray ve PngEncoder dönüştürmek tüm uygulama veya belirli bir bileşenin bir ekran görüntüsü almak için Flex/as3 işlevinde inşa kullanabilirsiniz

...

İşte bir örnek:

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

DÜZENLEME:

ben isteği yanlış düşündüğüm gibi ..

  1. uygulamasını (this.minimize();) veya 0 (this.alpha=0) için alfa ayarını azaltın: Aklıma

    tek yolu etmektir.

  2. Ekran görüntüsünü alın
  3. Uygulamayı maksimuma çıkarın (this.maximize();) veya alfa'yı 1 olarak ayarlayın (this.alpha=0).
+0

Üzgünüm. Masaüstü uygulamasını yakalamak istiyorum, esnek uygulamayı değil. – Vishnu

+0

Oh ... kahretsin ... Yanlış anlaşıldım ... cevap güncellendi. – Marcx

+0

Bu, ekranda yanıp sönen bir etkiye neden olur. Bitblt ekranı yakalamak için 200 ms sürüyor. Bunu denedim. Ve java – Vishnu

0

Düşündüğüm bir çözüm, "istenmeyen" pencereleri hareket ettirebilmenizdir. Bunun gibi bir kod ile (0,0 koordinatının altında).

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

ve

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