2014-02-22 95 views
2

我試圖製作一個屏幕轉換應用程序,該應用程序將投射個別應用程序窗口而不是整個屏幕。首先,我試圖在我的Mac上使用Xcode對個別應用程序進行簡單的截圖。在Mac上截取特定的應用程序窗口

到目前爲止,我試圖利用CGWindowListCreateImage,但我遇到了問題。

編輯 所以這裏是我如何設法獲得WindowID的一個小例子。之後使用它進行截圖非常簡單。 首先爲事件添加全局監視器,更具體地說是NSMouseEvents。我用鼠標向下。窗口信息存儲在鼠標事件中。

CGWindowID windowID = (CGWindowID)[event windowNumber]; 

然後,您可以使用下面的代碼截取JUST應用程序,沒有陰影等。

CGImageRef image = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, self.WindowID, kCGWindowImageBoundsIgnoreFraming); 

讓我知道你是否需要更多。

+2

什麼是你遇到的問題? –

+0

其實我修好了!我將發佈下面的代碼。 – user3339357

回答

4

所以這裏是我如何設法獲得WindowID的一個小例子。之後使用它進行截圖非常簡單。首先爲事件添加一個全局監視器,更具體地說NSMouseEvents。我用鼠標向下。窗口信息存儲在鼠標事件中。

CGWindowID windowID = (CGWindowID)[event windowNumber]; 

然後,您可以截取JUST該應用程序,沒有陰影等使用下面的代碼。

CGImageRef image = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, self.WindowID, kCGWindowImageBoundsIgnoreFraming); 

讓我知道你是否需要更多。

+0

那麼,如果沒有事件呢?例如在我的應用程序中,我只需要另一個應用程序的windowID並截取屏幕截圖,而無需先點擊鼠標。 –

+1

不,鼠標點擊不是唯一的方法。您可以獲取當前活動窗口的列表及其窗口ID,並使用它來截取屏幕截圖。您可以使用GWindowListCopyWindowInfo API執行此操作 – user3339357

+0

如何簡單地使用 - [NSWindow windowNumber]? –

0

基於user3339357的答案,斯威夫特3

let gImage = CGWindowListCreateImage(
     CGRect.null, 
     CGWindowListOption.optionIncludingWindow, 
     CGWindowID(window.windowNumber), 
     CGWindowImageOption.bestResolution) 

let image = NSImage(cgImage: cgImage!, size: window.frame.size) 
相關問題