I am developing Mac desktop application, where i am capturing the screen using
CGImageRef screenShot = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionAll, kCGNullWindowID, kCGWindowImageDefault);
and display the screen shot, The problem is, i am expecting it should show the mouse cursor too, but its not showing, do i need to enable any settings for that ?
I tried following before calling this function
CGDisplayShowCursor(kCGDirectMainDisplay); CGAssociateMouseAndMouseCursorPosition(true);
but it didn't work, When i checked using following
bool bCursor = CGCursorIsDrawnInFramebuffer(); /* This returns false */ bCursor = CGCursorIsVisible(); /* This returns true */
This values says, cursor was not drawn in the framebuffer ( ) but cursor is visible, I suppose only i need to do is, Draw cursor in the framebuffer, but how that is the challenge,
Thanks in advance.
it seems, framebuffer doesn't give me the mouse cursor, so i am drawing my own, this is the code snippet , might be help full to you guys,
-(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 */ }