【问题标题】:CGDisplayCreateImageForRect: how to ignore a specific NSWindowCGDisplayCreateImageForRect:如何忽略特定的 NSWindow
【发布时间】:2015-07-25 16:32:32
【问题描述】:

我正在寻找一个示例“镜头”应用程序,它显示在当前鼠标位置下可见的内容。我使用 CGDisplayCreateImageForRect 来获取鼠标位置下的屏幕部分。

现在我想在鼠标的同一位置附加一个透明窗口,并在鼠标位置正下方显示这个镜头;但是在这个位置下有...我的透明窗口,结果缩放...操作!

有没有办法从快照中排除特定窗口,或者通过忽略它后面的东西来获取鼠标位置的当前图像?

【问题讨论】:

    标签: macos cocoa core-graphics appkit


    【解决方案1】:

    你不能用那个函数来做。您可以使用 CGWindowList API 来执行此操作:CGWindowListCreateImage()CGWindowListCreateImageFromArray()。这些让您可以指定标准来选择要包含的窗口或明确的窗口列表。

    没有清楚地记录如何获取您自己的窗口之一的窗口 ID。支持的方法可能是使用CGWindowListCopyWindowInfo() 查询有关所有屏幕窗口的信息,然后使用属性来识别您的。也就是说,我相信NSWindow 属性windowNumber 实际上确实对应于Core Graphics 窗口ID。

    【讨论】:

    • 感谢您为我指明了正确的方向。为了获取窗口的 CGWindowID,我只需要获取 windowNumber:CGWindowID windowID = (CGWindowID)[myNSWindow windowNumber];。稍后我会用更完整的代码来回答这个问题。
    【解决方案2】:

    @ken-thomases 为我指明了正确的方向。我用来包含所有窗口并排除我的单个窗口的函数是CGWindowListCreateImageFromArray()

    下面的代码是一个小例子:

    // Get onscreen windows
    CGWindowID windowIDToExcude = (CGWindowID)[myNSWindow windowNumber];
    CFArrayRef onScreenWindows = CGWindowListCreate(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
    CFMutableArrayRef finalList = CFArrayCreateMutableCopy(NULL, 0, onScreenWindows);
    for (long i = CFArrayGetCount(finalList) - 1; i >= 0; i--) {
        CGWindowID window = (CGWindowID)(uintptr_t)CFArrayGetValueAtIndex(finalList, i);
        if (window == windowIDToExcude)
                CFArrayRemoveValueAtIndex(finalList, i);
    }
    // Get the composite image
    CGImageRef ref = CGWindowListCreateImageFromArray(myRectToGrab, finalList, kCGWindowListOptionAll);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2020-02-03
      • 2014-03-15
      • 2021-11-18
      • 2020-03-05
      • 1970-01-01
      相关资源
      最近更新 更多