2016-09-25 26 views
7

Czy można zrzutu ekranu programowo z pulpitu na komputerze Mac za pomocą Swift 3? Nie mogę znaleźć ani jednego wątku ani wpisu na forum na ten temat, nawet w oficjalnej dokumentacji Apple.Programowo Screenshot | Swift 3, macOS

Znalazłem to tak daleko, ale nie wydaje się, aby pomóc: onetwo

+0

ze względów bezpieczeństwa i prywatności jest bardzo znaczące zarówno dla deweloperów, jak i dla użytkowników. – holex

+0

Tak, rozumiem, ale nie mam zamiaru wypuszczać tego oprogramowania, a raczej uczę się i wykorzystuję w celach wewnętrznych i byłoby mi dobrze, gdyby pojawiło się małe okno "zaakceptuj zrzut ekranu". – user6879072

+1

'NSTask' -' screencapture' – vadian

Odpowiedz

9

Tak, to możliwe. Ta funkcja pobiera wszystkie podłączone monitory zrzuty ekranu i zapisuje do określonej ścieżki jako plik jpg. Generuje nazwę pliku jako znacznik czasu unix.

func TakeScreensShots(folderName: String){ 

    var displayCount: UInt32 = 0; 
    var result = CGGetActiveDisplayList(0, nil, &displayCount) 
    if (result != CGError.success) { 
     print("error: \(result)") 
     return 
    } 
    let allocated = Int(displayCount) 
    let activeDisplays = UnsafeMutablePointer<CGDirectDisplayID>.allocate(capacity: allocated) 
    result = CGGetActiveDisplayList(displayCount, activeDisplays, &displayCount) 

    if (result != CGError.success) { 
     print("error: \(result)") 
     return 
    } 

    for i in 1...displayCount { 
     let unixTimestamp = CreateTimeStamp() 
     let fileUrl = URL(fileURLWithPath: folderName + "\(unixTimestamp)" + "_" + "\(i)" + ".jpg", isDirectory: true) 
     let screenShot:CGImage = CGDisplayCreateImage(activeDisplays[Int(i-1)])! 
     let bitmapRep = NSBitmapImageRep(cgImage: screenShot) 
     let jpegData = bitmapRep.representation(using: NSBitmapImageFileType.JPEG, properties: [:])! 


     do { 
      try jpegData.write(to: fileUrl, options: .atomic) 
     } 
     catch {print("error: \(error)")} 
    } 
} 

func CreateTimeStamp() -> Int32 
{ 
    return Int32(Date().timeIntervalSince1970) 
} 
+0

Nie sprawdziłem jeszcze twojego kodu, ale wygląda on na jakość, w przeciwieństwie do sposobu, w jaki rozwiązałem go za pomocą skryptów i terminala. Po tak długim czasie nie oczekiwałem żadnych odpowiedzi. – user6879072

+0

To działa, to naprawdę dobra implementacja obsługuje wiele wyświetlaczy. – Magrafear

+0

@ B.Tekkan @Magrafear Wystąpił błąd CreateTimeStamp(): 'let unixTimestamp = CreateTimeStamp()' "użycie nierozwiązanego identyfikatora 'CreateTimeStan'" – user6879072

2
let displayID = CGMainDisplayID() 
let imageRef = CGDisplayCreateImage(displayID)