3

CGWindowListCreateImage を使用してスクリーンショットを取得しています。windowID がわかっている特定のウィンドウを取得しようとしています。これは私が使用しているコードですが、すべてのウィンドウを含む画面全体を常に取得しているようです。

CGImageRef windowImage = CGWindowListCreateImage(
      CGRectNull, 
      kCGWindowListOptionOnScreenOnly, 
      windowID, 
      kCGWindowImageBoundsIgnoreFraming);

私は何を間違っていますか?

4

2 に答える 2

4

すべてのウィンドウを含む画面全体を取得するように要求しているので、要求したとおりの結果が得られます。ドキュメントを見てください:

windowOption

画像に含めるウィンドウを説明するオプション。一般的なオプションでは、すべてのウィンドウ、またはwindowIDパラメーターで指定されたウィンドウの上または下のウィンドウを選択できます。詳細については、「ウィンドウリストオプション定数」を参照してください。</ p>

この値については、を渡します。これは、次のことkCGWindowListOptionOnScreenOnlyを意味します。

現在画面に表示されているすべてのウィンドウを一覧表示します。ウィンドウは前から後ろに順番に返されます。このオプションを使用してリストを取得する場合は、relativeToWindowパラメーターをkCGNullWindowIDに設定する必要があります。

技術的には、windowIDを使用してこのオプションを渡すことは合法ではありませんが、渡す場合、Quartzは優れており、IDを無視するだけです。

スクリーンショットをウィンドウの画面の長方形にバインドする場合は、ではなく、それを渡す必要がありますCGRectNull。また、ウィンドウの前にあるものではなく、ウィンドウを隠したい場合はkCGWindowListOptionOnScreenBelowWindow | kCGWindowListOptionIncludingWindow、オプションに使用してください。

于 2012-08-16T18:19:29.707 に答える
1

私はちょうど同じ問題を抱えていました。このkCGWindowImageBoundsIgnoreFramingオプションは、以下を指定できるように文書化されていますCGRectNull

要求されたキャプチャ四角形が の場合、CGRectNullこのオプションを使用すると、ウィンドウ領域のみがキャプチャされ、ウィンドウ フレーミング エフェクトが占める領域はキャプチャされません。

しかし、私にとってはkCGWindowListOptionIncludingWindow、唯一のウィンドウオプションとして指定する必要がありました. これは、ドキュメントの内容と少し矛盾しています。

意味のある結果を取得するには、このオプションをkCGWindowListOptionOnScreenAboveWindoworオプションと組み合わせる必要があります。kCGWindowListOptionOnScreenBelowWindow

しかし、そのアドバイスに従えば、スクリーンショットは常に画面全体でした。要約すると、次のことが期待どおりに機能しました。

CGImageRef windowImage = CGWindowListCreateImage(
      CGRectNull, 
      kCGWindowListOptionIncludingWindow, 
      windowID, 
      kCGWindowImageBoundsIgnoreFraming);

(または、ほぼ予想どおり - スクリーンショットにはまだウィンドウのタイトルバーが含まれており、ウィンドウkCGWindowImageBoundsIgnoreFramingのタイトルバーもスキップされることを意味することを望んでいました)。

于 2017-06-16T14:09:28.147 に答える