gpt4 book ai didi

objective-c - 在没有窗口的情况下截屏

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:02 24 4
gpt4 key购买 nike

我一直在研究 Son Of Grab Apple 演示,我真的很难获得没有任何窗口(只有桌面、停靠栏和菜单栏)的屏幕截图。有谁知道怎么做?

最佳答案

这里有一些示例代码,它只截取了桌面的屏幕截图。

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) 及更高级别的任何内容。

关于objective-c - 在没有窗口的情况下截屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14666123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com