2015-06-18 7 views
43

मैंने एक एआईआर एप्लीकेशन बनाया है जिसमें दो खिड़कियां हैं। पहला मुख्य विंडो (स्पार्क विंडो वाला एप्लीकेशन) है और दूसरा एक घटक (स्पार्क विंडो) है। मैं फ्लेक्स-जावा ब्रिज फ्लेरी के साथ डेस्कटॉप स्क्रीन को कैप्चर करने के लिए जावा का उपयोग कर रहा हूं।कैप्चर होने से विंडो छोड़ें

यहाँ स्क्रीन है जो कब्जा करने के लिए कोड है: -

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

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

+1

@Iinspectable SetWindowDisplayAffinity खिड़की पर कब्जा होने से नहीं छोड़ता है। यह सिर्फ खिड़की को कब्जा करने से बचाएगा। मैं उस खिड़की के स्थान पर काली स्क्रीन नहीं चाहता, मैं खिड़की के पीछे की ओर दिखाना चाहता हूं। – Vishnu

+0

किसी को भी यह जानना चाहिए कि आप क्या चाहते हैं, जब आपका प्रश्न वांछित व्यवहार को दूरस्थ रूप से निर्दिष्ट नहीं करता है? आपकी टिप्पणी में क्या पूछा गया है - आम तौर पर - संभव नहीं है। – IInspectable

उत्तर

1

यदि मैं आपकी समस्या को सही ढंग से समझ गया।

आप पूरे आवेदन या एक विशेष घटक के एक स्क्रीनशॉट लेने के लिए तो bytearray और PngEncoder में तब्दील (या JPGEncoder अगर आप पसंद करते हैं), इसे सहेजने से फ्लेक्स/AS3 समारोह में बनाया का उपयोग कर सकते हैं ...

यहाँ एक उदाहरण:

<?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) पर सेट करें।
+0

क्षमा करें। मैं डेस्कटॉप स्क्रीन पर कब्जा करना चाहता हूं, फ्लेक्स ऐप नहीं। – Vishnu

+0

ओह ... बांधो ... मुझे गलत समझा गया ... उत्तर अपडेट किया गया। – Marcx

+0

जो स्क्रीन पर एक झुर्रियों वाला प्रभाव डालता है। स्क्रीन पर कब्जा करने के लिए बिटबल्ट 200 एमएस लेता है। मैंने कोशिश की है। और आप जावा – Vishnu

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(); 
संबंधित मुद्दे