2013-03-16 8 views
9

Ich muss die Möglichkeit hinzufügen, Screenshots zu meinen OSX-Anwendungen zu machen, aber die Apple-Demo gibt mir nur das ganze Bild, ich möchte nur nur meine Anwendung Fensterbild.Screenshot programmatisch in Mac nur für das Anwendungsfenster

Mein Code ist:

NSInteger displaysIndex = 0; 
if(displays != nil) 
{ 
    free(displays); 
} 


CGError    err = CGDisplayNoErr; 
CGDisplayCount  dspCount = 0; 

/* How many active displays do we have? */ 
err = CGGetActiveDisplayList(0, NULL, &dspCount); 

/* If we are getting an error here then their won't be much to display. */ 
if(err != CGDisplayNoErr) 
{ 
    return; 
} 
/* Allocate enough memory to hold all the display IDs we have. */ 
displays = calloc((size_t)dspCount, sizeof(CGDirectDisplayID)); 

// Get the list of active displays 
err = CGGetActiveDisplayList(dspCount, 
          displays, 
          &dspCount); 

/* Make a snapshot image of the current display. */ 
CGImageRef image = CGDisplayCreateImage(displays[displaysIndex]); 

Was soll ich in Code ändern, so werde ich nur Fenster meiner App bekommen?

Antwort

6

Einfach.

NSImage *captureImage = [[NSImage alloc] initWithData:[self.view dataWithPDFInsideRect:[self.view bounds]]]; 

bitte überprüfen Sie und lassen Sie mich wissen. Dies ist das aktuell aktive Fenster.

+3

Dies wird nur den Inhalt einer Ansicht und ihrer Nachkommen erfassen; Selbst wenn Sie dies in der Inhaltsansicht des Fensters ansprechen, wird der Rahmen des Fensters trotzdem ausgeschlossen. Außerdem können Sie die Konvertierung von und zu PDF überspringen, indem Sie den Fokus auf ein Bild fixieren und der Ansicht eine 'drawRect:' - Nachricht senden (was normalerweise nicht gerechtfertigt ist, aber in diesem Fall angemessen ist) oder 'bitmapImageRepForCachingDisplayInRect:' und verwenden die entsprechende Methode dieses Bild rep und Hinzufügen der rep zu einem leeren Bild. –

6

Um tatsächlich einen Screenshot Ihres Fensters einschließlich seines Rahmens und Schattens zu erstellen, rufen Sie die windowNumber Ihres Fensters auf und übergeben Sie diese an the CGWindowListCreateImage function.

+0

Dies ist ein besserer Ansatz IMO. – Chuck

Verwandte Themen