2

私は、Objective C で次のような OS X ルーチンを作成する方法を見つけようとしています。

  • バックグラウンドで実行され(別のスレッド)、

  • 指定されたウィンドウ/スクリーンのいくつかの定義されたサブセットを繰り返し (時間指定または特定の基準が満たされたときに) キャプチャします (つまり、ユーザーの操作なしで)。

  • 指定したパスに画像を保存します。

「cmd-shift-4 + mouseDown-drag の事前にプログラムされたループ」の出力に似ています。

Mac Developer Library の SonofGrab も ScreenSnapshot も、これを行う方法を示していないようですが、CGImageRef がその方法の 1 つまたは (?) 方法であると思われます。

  1. 誰もそれを行う方法を知っていますか?

  2. この問題を解決するために CGImageRef 以外に考えられる方法はありますか? たとえば、コマンドライン ツールと NSTask を介して実行できますか?

  3. もしそうなら、速度と複雑さの点で、さまざまな方法の利点/欠点は何ですか?

4

1 に答える 1

2

スクリーン グラブ (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).

于 2013-02-08T00:31:12.980 に答える