2011-11-10 1 views
3

デスクトップアイテムや開いている可能性のあるウィンドウ(つまり壁紙)を使わずにMac OS Xデスクトップをキャプチャすることは可能ですか?ココア:デスクトップの壁紙のスクリーンショット(アイコンとウィンドウなし)

私はCGWindowListCreateImage,CGWindowListCreateImageFromArray、およびCGDisplayCreateImageと実験しましたが、運はありません。

私は基本的に[NSWorkspace desktopImageURLForScreen:]を使用せずにデスクトップの壁紙をキャプチャしようとしています(ファイルシステムにアクセスできないサンドボックスアプリケーションです)。

+0

は、ちょうどあなたの背景画像ではないでしょうか? – JMK

+0

@ハイセンブルクはい。それは私がキャプチャしようとしているものです(それは私がディスクからそれを読むことができないので、サンドボックスのアプリケーションです) – Mark

答えて

5

これが正しいことをテストするには注意が必要ですが、デスクトップウィンドウはFinderの下にあります(ドックによって描画されます)。 kCGWindowListOptionOnScreenBelowWindowCGWindowListOptionCGWindowListCreateImageに渡すと、(他の何かがそのレベル以下になっている場合を除き)必要なものが得られます。

そうでない場合は、CGWindowListCreateを使用して、ウィンドウレベルkCGMinimumWindowLevel + 19のドックで描画されていないものを除外して応答を繰り返す必要があります。

複数の画面がある場合は面倒ですが、この情報で十分です。

4

私はこれが非常に古い質問で、Tony Arnoldの質問は正しいと思っています。自分の "デスクトップをつかむ"コードを構築するために使ったことは正しいです。

は、私はこれらすべてのことを行う方法を示していますいくつかのサンプルコード(それはほとんど文書化されているココアの一部を歩いて素晴らしいことだ...)

私はビットバケットにそのサンプルコードを我慢しましたがありますリポジトリ。具体的にはthe code sample to take a picture。 (もっと面白いココアのコードは、そのサンプルコードから提示された私のlearning Cocoaリポジトリにあります)

+0

あなたのシェアのために偉大な、ありがとう! –

1

スウィフトバージョン:

extension NSImage { 

    static func desktopPicture() -> NSImage { 

     let windows = CGWindowListCopyWindowInfo(
      CGWindowListOption.OptionOnScreenOnly, 
      CGWindowID(0))! as NSArray 

     var index = 0 
     for var i = 0; i < windows.count; i++ { 
      let window = windows[i] 

      // we need windows owned by Dock 
      let owner = window["kCGWindowOwnerName"] as! String 
      if owner != "Dock" { 
       continue 
      } 

      // we need windows named like "Desktop Picture %" 
      let name = window["kCGWindowName"] as! String 
      if !name.hasPrefix("Desktop Picture") { 
       continue 
      } 

      // wee need the one which belongs to the current screen 
      let bounds = window["kCGWindowBounds"] as! NSDictionary 
      let x = bounds["X"] as! CGFloat 
      if x == NSScreen.mainScreen()!.frame.origin.x { 
       index = window["kCGWindowNumber"] as! Int 
       break 
      } 
     } 

     let cgImage = CGWindowListCreateImage(
      CGRectZero, 
      CGWindowListOption(arrayLiteral: CGWindowListOption.OptionIncludingWindow), 
      CGWindowID(index), 
      CGWindowImageOption.Default)! 

     let image = NSImage(CGImage: cgImage, size: NSScreen.mainScreen()!.frame.size) 
     return image 
    } 
} 
+0

NSZeroSizeは「CGImageと同じサイズ」の省略形です。 –

関連する問題