我一直在研究一个 c++ 命令行工具来记录屏幕。经过一番搜索,我想出了以下代码。当我编译和运行代码时,看起来屏幕正在被记录。我正在寻找可以提供存储屏幕记录的特定文件路径的功能。我还想将时间戳与文件名一起附加。如果有人对这个问题有更好的方法或方法,请在这里建议。任何线索都值得赞赏。谢谢
#include <ApplicationServices/ApplicationServices.h>
int main(int argc, const char * argv[]) {
// insert code here...
CGRect mainMonitor = CGDisplayBounds(CGMainDisplayID());
CGFloat monitorHeight = CGRectGetHeight(mainMonitor);
CGFloat monitorWidth = CGRectGetWidth(mainMonitor);
const void *keys[1] = { kCGDisplayStreamSourceRect };
const void *values[1] = { CGRectCreateDictionaryRepresentation(CGRectMake(0, 0, 100, 100)) };
CFDictionaryRef properties = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
CGDisplayStreamRef stream = CGDisplayStreamCreate(CGMainDisplayID(), monitorWidth, monitorHeight, '420f' , properties, ^(CGDisplayStreamFrameStatus status, uint64_t displayTime, IOSurfaceRef frameSurface, CGDisplayStreamUpdateRef updateRef){});
CGDirectDisplayID displayID = CGMainDisplayID();
CGImageRef image_create = CGDisplayCreateImage(displayID);
CFRunLoopSourceRef runLoop = CGDisplayStreamGetRunLoopSource(stream);
// CFRunLoopAddSource(<#CFRunLoopRef rl#>, runLoop, <#CFRunLoopMode mode#>);
CGError err = CGDisplayStreamStart(stream);
if (err == CGDisplayNoErr) {
std::cout<<"WORKING"<<std::endl;
sleep(5);
} else {
std::cout<<"Error: "<<err<<std::endl;
}
//std::cout << "Hello, World!n";
return 0;
}
您应该在CGDisplayStreamCreate
中提供的回调中执行此操作。您可以通过IOSurfaceGetBaseAddress访问像素(请参阅其他IOSurface函数(。如果你不想自己做像素摆动,你可以从IOSurface
用CVPixelBufferCreateWithBytes创建一个CVPixelBuffer
,然后用[CIImage imageWithCVImageBuffer]创建一个CIImage
,并将其保存到文件中,如此处所示。