2015-06-18 21 views
43

Tôi đã tạo một ứng dụng AIR có hai cửa sổ. Đầu tiên là cửa sổ chính (spark Windowed Application) và cửa sổ thứ hai là một thành phần (cửa sổ tia lửa). Tôi đang sử dụng Java để chụp màn hình Desktop với Flex-Java Bridge Flerry.Bỏ qua cửa sổ để bị bắt

Đây là đoạn mã để chụp màn hình đó là: -

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

Tôi không muốn cửa sổ flex chính để được chụp. Nó sẽ bị bỏ qua (trong suốt) khỏi bị bắt.

Có thể thay đổi cấu hình của dự án flex không?

Nếu nó không thể được thực hiện trong flex và java, trong nền tảng nào nó có thể được thực hiện?

+0

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

+1

@iinspectable SetWindowDisplayAffinity không bỏ qua cửa sổ bị bắt. Nó sẽ chỉ bảo vệ cửa sổ khỏi bị bắt. Tôi không muốn màn hình màu đen ở vị trí của cửa sổ đó, tôi muốn cửa sổ mặt sau của nó được hiển thị. – Vishnu

+0

Làm thế nào để ai đó biết được bạn muốn gì, khi câu hỏi của bạn thậm chí không chỉ định hành vi mong muốn từ xa? Những gì đã yêu cầu trong bình luận của bạn là - nói chung - không thể. – IInspectable

Trả lời

1

Nếu tôi hiểu chính xác vấn đề của bạn.

Bạn có thể sử dụng được xây dựng trong chức năng/AS3 Flex để có một ảnh chụp màn hình của toàn bộ ứng dụng hoặc một thành phần đặc biệt sau đó chuyển đổi thành bytearray và PngEncoder (hoặc JPGEncoder nếu bạn thích), so với lưu nó ...

Dưới đây là một ví dụ:

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

Như tôi nghĩ tôi hiểu lầm theo yêu cầu ..

Cách duy nhất tôi có thể nghĩ đến là:

  1. Giảm thiểu các ứng dụng (this.minimize();) hoặc thiết lập các alpha 0 (this.alpha=0).
  2. Hãy hình
  3. Tối đa hóa các ứng dụng (this.maximize();) hoặc thiết lập các alpha 1 (this.alpha=0).
+0

Xin lỗi. Tôi muốn chụp màn hình máy tính để bàn chứ không phải ứng dụng flex. – Vishnu

+0

Oh ... dammit ... Tôi hiểu lầm ... câu trả lời đã được cập nhật. – Marcx

+0

Điều đó gây ra hiệu ứng nhấp nháy trên màn hình. Bitblt mất 200 ms để chụp màn hình. Tôi đã thử điều đó. Và bạn không thể sử dụng 'this.minimize' hoặc' this.alpha' của ứng dụng flex trong java – Vishnu

0

Một giải pháp mà tôi có thể nghĩ là bạn có thể di chuyển các cửa sổ "không mong muốn" ra khỏi quá trình chụp. (Dưới 0,0 tọa độ) với một số mã như thế này.

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

và hơn

foo(); 
capture(); 
foo(); 
Các vấn đề liên quan