长话短说,我想捕获一个窗口,然后修改字节缓冲区:
struct CaptureObject
{
unsigned char* bgraData;
CFDataRef bgraDataRef;
CGDataProviderRef provider;
int width;
int height;
int bytesPerRow;
};
CaptureObject obj;
CGImageRef windowImage = CGWindowListCreateImage(captureCGRect, kCGWindowListOptionIncludingWindow, windowId, kCGWindowImageBoundsIgnoreFraming | kCGWindowImageShouldBeOpaque);
obj.width = CGImageGetWidth(windowImage);
obj.height = CGImageGetHeight(windowImage);
obj.bytesPerRow = CGImageGetBytesPerRow(windowImage);
obj.provider = CGImageGetDataProvider(windowImage);
obj.bgraDataRef = CGDataProviderCopyData(obj.provider);
obj.bgraData = const_cast<unsigned char*>(CFDataGetBytePtr(obj.bgraDataRef));
//Read and right obj.bgraData;
CGImageRelease(windowImage);
CFRelease(browserImage.bgraDataRef);
CGDataProviderRelease(browserImage.provider);
我可以读取数据,但在尝试写入此缓冲区时遇到崩溃。 正如documentation&#39; CFDataGetBytePtr&#39;中明确注意到的那样:
返回指向CFData对象字节的只读指针。
但它究竟意味着什么?如果这只是一种编译语法,我认为&#39; const_cast&#39;应该解决这个问题所以我的问题是操作系统如何管理分配对象&#34;只读&#34;段(类似于&#34;代码段&#34;);
P.S。我试图避免使用&#39; CFDataGetByte&#39;这实际上是复制数据,因为它对我来说太贵了。