我一直在研究Son of Grab Apple演示,我真的很努力得到屏幕沒有任何窗口(只有桌面,碼頭和菜單欄)的屏幕截圖。有誰知道如何去做?沒有窗口的ScreenShot
2
A
回答
3
下面是一些示例代碼,它只是在桌面上進行截圖。
CFArrayRef onScreenWindows = CGWindowListCreate(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
CFArrayRef nonDesktopElements = CGWindowListCreate(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
CFRange range = CFRangeMake(0, CFArrayGetCount(nonDesktopElements));
CFMutableArrayRef desktopElements = CFArrayCreateMutableCopy(NULL, 0, onScreenWindows);
for (int i = CFArrayGetCount(desktopElements) - 1; i >= 0; i--)
{
CGWindowID window = (CGWindowID)(uintptr_t)CFArrayGetValueAtIndex(desktopElements, i);
if (CFArrayContainsValue(nonDesktopElements, range, (void*)(uintptr_t)window))
CFArrayRemoveValueAtIndex(desktopElements, i);
}
CGImageRef cgimage = CGWindowListCreateImageFromArray(CGRectInfinite, desktopElements, kCGWindowListOptionAll);
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithCGImage:cgimage];
NSData* data = [rep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]];
[data writeToFile:@"/tmp/foo.png" atomically:YES];
你應該能夠擴展一般的方法來獲取Dock和菜單欄。您構建您感興趣的窗口ID列表,然後致電CGWindowListCreateImageFromArray()
。我通過請求所有的屏幕窗口,然後除了桌面元素之外的所有屏幕窗口來計算桌面元素的窗口ID。桌面元素是第一個列表中不在第二個列表中的元素。
獲取菜單欄和Dock的窗口ID並不像那樣直接,因爲在CGWindowList API中沒有與其直接對應的選項。您需要使用CGWindowListCopyWindowInfo()
或CGWindowListCreateDescriptionFromArray()
來獲取屏幕窗口的描述字典數組,並檢查其內容。最有用的密鑰可能是kCGWindowLayer
。除了使用我的示例代碼中的技術獲得的桌面元素外,我認爲您還需要CGWindowLevelForKey(kCGDockWindowLevelKey)
以上的任何內容。
相關問題
- 1. 沒有窗口的Tkinter messagebox?
- 2. 窗口沒有WinAPI的
- 3. 有/沒有顯示窗口
- 4. Tkinter沒有創建窗口?
- 5. Win32:沒有窗口出現
- 6. Javascript:'窗口'沒有定義
- 7. SFML窗口沒有出現
- 8. OpenfileDialog - 窗口沒有彈出
- 9. WPF窗口沒有關閉
- 10. 沒有窗口系統
- 11. jQuery沒有關閉窗口
- 12. 沒有在QFileDialog窗口
- 13. OpenGL窗口沒有打開
- 14. JFrame沒有關閉窗口?
- 15. 控制''沒有父窗口
- 16. Tkinter窗口沒有打開
- 17. FindWindowEx沒有窗口標題
- 18. 沒有情節窗口matplotlib
- 19. 窗口沒有彈出
- 20. window.open沒有打開窗口
- 21. 我的模態窗口沒有顯示爲彈出窗口
- 22. 父窗口沒有收到窗口的消息(Key Events)
- 23. 如何實現沒有javascript的彈出窗口確認窗口
- 24. 使窗口焦點沒有窗口的裝飾
- 25. 如何確保使用Perl的Imager :: Screenshot截取特定窗口的截圖?
- 26. WPF中的ScreenShot
- 27. Capture screenshot
- 28. Vim:有沒有命令切換窗口
- 29. 有沒有Ajax窗口框架?
- 30. iOS sdk - 沒有彈出窗口的UIImagePickerController
非常感謝!它像手套一樣安裝! –
不客氣。我應該提到我的示例代碼沒有包含適當的內存管理。當你完成它們的時候,不要忘記'CFRelease()'數組和CGImage。如果你不使用ARC,你也應該釋放'NSBitmapImageRep'。 –
我會記得正確地衝洗一切在那裏創建:D這是一個很好的建議! –