Mac 데스크톱에 흩어져 있는 아이콘을 일시적으로 숨기는 앱 만들어 보았다

8469 단어 MacOSX

소개



macOS의 네이티브 애플리케이션을 잘 만드는데 앱 심사 신청을 위해 스크린샷을 찍을 때 매번 데스크톱을 깨끗하게 하는 것이 귀찮았습니다. 그래서 데스크톱을 일시적으로 깨끗하게 보여주는 앱을 살짝 만들어 보았습니다.

완성하고 「했어ー」라고 생각하면, 완전히 같은 기능을 가진 앱이 AppStore에서 전달되고 있었습니다 orz... HiddenMe 라고 하는 앱입니다. 멀티 디스플레이 대응으로 하려면 과금이 필요 같네요.

아티팩트



GitHub에 소스와 .dmg 다운로드 링크가 있습니다.
htps : // 기주 b. 코 m / 쿄메 22 / 세크 t에서 sk와 p

메뉴 바에 상주하는 아이콘에서 Hide Desktop를 눌러 토글 할 수 있습니다. 기본적으로 멀티 디스플레이를 지원합니다.

동작 확인하는 것이 귀찮았기 때문에 .dmg 에서의 배포판은 macOS Mojave 10.14 이상에서 밖에 움직이지 않습니다. Mojave 이하로 이동하고 싶은 사람은 GitHub에서 소스 다운로드하여 타겟 버전을 낮추어보십시오.

포인트



요점은 아이콘의 한 장 위의 레이어에 NSImageView 로 배경의 이미지를 붙여 숨기고 있을 뿐입니다만, 배경 이미지를 가져오는 곳의 Tips가 적어 구현 귀찮았습니다.

Extensions.swift
extension NSImage {
    static func desktopPicture(targetPoint: CGPoint) -> NSImage? {
        guard let rawList: NSArray = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) else {
            return nil
        }
        var windowList = rawList as! [NSDictionary]
        windowList = windowList.filter { (data) -> Bool in
            if let owner = data[kCGWindowOwnerName] as? String, owner == "Dock" {
                if let name = data[kCGWindowName] as? String, name.contains("Desktop Picture") {
                    return true
                }
            }
            return false
        }
        for window in windowList {
            let bounds = window[kCGWindowBounds] as! NSDictionary
            let X = bounds["X"] as! CGFloat
            let Y = bounds["Y"] as! CGFloat
            let W = bounds["Width"] as! CGFloat
            let H = bounds["Height"] as! CGFloat
            let rect = CGRect(x: X, y: Y, width: W, height: H)
            if rect.contains(targetPoint) {
                let id = window[kCGWindowNumber] as! UInt32
                guard let cgImage = CGWindowListCreateImage(rect, .optionIncludingWindow, id, .boundsIgnoreFraming) else {
                    break
                }
                let nsImage = NSImage(cgImage: cgImage, size: rect.size)
                nsImage.resizingMode = NSImage.ResizingMode.stretch
                return nsImage
            }
        }
        return nil
    }
}
CGWindowListCopyWindowInfo 라고 하는 것으로부터 감싸는 식에 데스크탑의 Window 의 정보를 뽑아 오고 있습니다.

그리고 아이콘의 한 장 위에 있는 레이어에 NSWindow 를 배치한다는 것은 이런 느낌으로 했습니다.self.window!.level = NSWindow.Level(Int(CGWindowLevelForKey(CGWindowLevelKey.normalWindow)) - 1)일반 응용 프로그램의 Window를 배치해야 할 레이어의 한 계층 아래에 ​​배치합니다.

좋은 웹페이지 즐겨찾기