[TRUKéASTUCE] Copier le contenu d'une fenêtre dans une NSImage

BruBru Membre
La petite fonction qui suit permet de copier le contenu de n'importe quelle fenêtre (à  l'écran ou non) en passant son window-id en paramètre. La copie est faite dans un objet NSImage.


<br />static NSImage* GrabWindow(int wid)<br />{<br />&nbsp; &nbsp; NSImage *img;<br />&nbsp; &nbsp; int cid;<br />&nbsp; &nbsp; CGRect cgrect;<br />&nbsp; &nbsp; NSRect nsrect;<br />&nbsp; &nbsp; void *grafport;<br /><br />&nbsp; &nbsp; // récupération du context-id<br />&nbsp; &nbsp; cid=[NSApp contextID];<br /><br />&nbsp; &nbsp; // récupération des coords de la fenêtre<br />&nbsp; &nbsp; CGSGetWindowBounds(cid, wid, &amp;cgrect);<br /><br />&nbsp; &nbsp; // transformation du CGRect en NSRect<br />&nbsp; &nbsp; nsrect.origin.x=cgrect.origin.x;<br />&nbsp; &nbsp; nsrect.origin.y=cgrect.origin.y;<br />&nbsp; &nbsp; nsrect.size.width=cgrect.size.width;<br />&nbsp; &nbsp; nsrect.size.height=cgrect.size.height;<br /><br />&nbsp; &nbsp; // création d&#39;une NSImage<br />&nbsp; &nbsp; img=[[NSImage alloc] initWithSize:nsrect.size];<br /><br />&nbsp; &nbsp; // mise en avant du contexte graphique de l&#39;image<br />&nbsp; &nbsp; [img lockFocus];<br /><br />&nbsp; &nbsp; // récupération du grafport du contexte graphique mis en avant<br />&nbsp; &nbsp; grafport=[[NSGraphicsContext currentContext] graphicsPort];<br /><br />&nbsp; &nbsp; // mise à  zero du point d&#39;origine de la copie de la fen^tre<br />&nbsp; &nbsp; cgrect.origin=CGPointZero;<br /><br />&nbsp; &nbsp; // copie du contenu de la fenêtre vers le contexte graphique mis en avant<br />&nbsp; &nbsp; cgrect.origin=CGPointZero;<br />&nbsp; &nbsp; CGContextCopyWindowCaptureContentsToRect(grafport, cgrect, cid, wid, 0);<br /><br />&nbsp; &nbsp; // retrait du contexte graphique de l&#39;image mis en avant<br />&nbsp; &nbsp; [img unlockFocus];<br /><br />&nbsp; &nbsp; // fin de la procéure : on retourne l&#39;image<br />&nbsp; &nbsp; return [img autorelease];<br />}<br />



Le window-id de type int peut être récupéré via diverses méthodes :

  • méthode non-documentée _realWindowNumber de la classe NSWindow : permet de récupérer le window-id des fenêtres de l'application qu'on développe.
  • fonction NSWindowList : fonction C de l'Application Kit qui retourne la liste des window-id de toutes les fenêtres présentes à  l'écran.
  • fonctions non-documentées CGSGetWindowList ou CGSGetOnScreenWindowList de l'API Core Graphics


.
Connectez-vous ou Inscrivez-vous pour répondre.