2011-11-04 4 views
4

Je développe l'application de bureau Mac, où je suis la capture de l'écran à l'aideNe pas afficher curseur de la souris

CGImageRef screenShot = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionAll, kCGNullWindowID, kCGWindowImageDefault); 

et afficher la capture d'écran, Le problème est, je m'y attendais doit afficher le curseur de la souris aussi, mais il ne montre pas, dois-je activer les paramètres pour cela?

J'ai essayé suivante avant d'appeler cette fonction

CGDisplayShowCursor(kCGDirectMainDisplay); 

CGAssociateMouseAndMouseCursorPosition(true); 

mais cela n'a pas fonctionné, Quand je vérifié à l'aide suivante

bool bCursor = CGCursorIsDrawnInFramebuffer(); /* This returns false */ 

bCursor = CGCursorIsVisible(); /* This returns true */ 

Cette valeurs dit, le curseur n'a pas été établi dans le framebuffer () mais le curseur est visible, Je suppose que seulement je dois faire est, dessiner le curseur dans le framebuffer, mais comment c'est le défi,

Merci d'avance.

+0

Comme le 2016, maintenant i Je n'utilise pas de cadre CG pour capturer le flux d'images de bureau, maintenant je me suis déplacé sur le framework AVFoundation, qui fonctionne très bien et a ajouté le curseur de la souris intégré. – Amitg2k12

Répondre

6

il semble, framebuffer ne me donne pas le curseur de la souris, donc je dessine mon propre, c'est l'extrait de code, peut-être aider pleinement à vous les gars,

-(CGImageRef)appendMouseCursor:(CGImageRef)pSourceImage{ 
    // get the cursor image 
    NSPoint mouseLoc; 
    mouseLoc = [NSEvent mouseLocation]; //get cur 

    NSLog(@"Mouse location is x=%d,y=%d",(int)mouseLoc.x,(int)mouseLoc.y); 

    // get the mouse image 
    NSImage *overlay = [[[NSCursor arrowCursor] image] copy]; 

    NSLog(@"Mouse location is x=%d,y=%d cursor width = %d, cursor height = %d",(int)mouseLoc.x,(int)mouseLoc.y,(int)[overlay size].width,(int)[overlay size].height); 

    int x = (int)mouseLoc.x; 
    int y = (int)mouseLoc.y; 
    int w = (int)[overlay size].width; 
    int h = (int)[overlay size].height; 
    int org_x = x; 
    int org_y = y; 

    size_t height = CGImageGetHeight(pSourceImage); 
    size_t width = CGImageGetWidth(pSourceImage); 
    int bytesPerRow = CGImageGetBytesPerRow(pSourceImage); 

    unsigned int * imgData = (unsigned int*)malloc(height*bytesPerRow); 

    // have the graphics context now, 
    CGRect bgBoundingBox = CGRectMake (0, 0, width,height); 

    CGContextRef context = CGBitmapContextCreate(imgData, width, 
                height, 
                8, // 8 bits per component 
                bytesPerRow, 
                CGImageGetColorSpace(pSourceImage), 
                CGImageGetBitmapInfo(pSourceImage)); 

    // first draw the image 
    CGContextDrawImage(context,bgBoundingBox,pSourceImage); 

    // then mouse cursor 
    CGContextDrawImage(context,CGRectMake(0, 0, width,height),pSourceImage); 

    // then mouse cursor 
    CGContextDrawImage(context,CGRectMake(org_x, org_y, w,h),[overlay CGImageForProposedRect: NULL context: NULL hints: NULL]); 


    // assuming both the image has been drawn then create an Image Ref for that 

    CGImageRef pFinalImage = CGBitmapContextCreateImage(context); 

    CGContextRelease(context); 

    return pFinalImage; /* to be released by the caller */ 
} 
Questions connexes