我一直试图弄清楚如何在目标C中创建一个OS X例程:
在后台运行(单独的线程)和
重复(定时或满足某些条件时)捕获指定窗口/屏幕的若干已定义子集(即无需用户交互)和
将图像保存到指定的路径中。
类似于“预编程的cmd-shift-4 + mouseDown-drag循环”的输出。
来自Mac开发者库的SonofGrab和ScreenSnapshot都没有表明如何做到这一点,但我怀疑CGImageRef是一种/(?)方式。
有谁知道怎么做?
除了CGImageRef之外还有其他可能的方法来解决这个问题吗?例如,它可以通过命令行工具和NSTask来完成吗?
如果是这样,不同方法在速度和复杂性方面有哪些优点/缺点?
答案 0 :(得分:2)
假设您具有执行screengrab所需的逻辑(您可以在SonOfGrab中看到),您只需使用调度队列或计时器来完成这项工作。
void MyTakeScreengrab();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_source_t timerSrc = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,queue);
dispatch_source_set_timer(timerSrc,
dispatch_time(DISPATCH_TIME_NOW,0) /* start on */,
SECONDS_PER_GRAB * NSEC_PER_SEC /* interval */,
NSEC_PER_SEC /* leeway */);
dispatch_source_set_event_handler_f(timerSrc, MyTakeScreengrab);
dispatch_resume(timerSrc);
您也可以使用NSTimer。
-(void)setup {
_timer = [[NSTimer scheduledTimerWithTimeInterval: (NSTimerInterval)SECONDS_PER_GRAB
target: self
selector: @selector(takeScreegrabOnBGThread:)
userInfo: @{ @"folderPath" : MyFolderPath(),
@"imageSettings" : MYCGImageSettings() }
repeats: YES];
[_timer fire];
}
-(void)takeScreengrabOnBGThread:(id)userInfo {
[self performSelectorInBackground:@selector(takeScreengrabBlocking:)
withObject:userInfo];
}
-(void)takeScreengrabBlocking:(id)userInfo {
MyTakeScreengab(userInfo);
}
要使用终端执行此操作,您要查找的命令为screencapture(1)
。