4

Cocoa アプリケーションで追加の画面がプラグイン/アンプラグされていることを検出する方法を知っていますか?

ユーザーが別の画面を自分の Mac に接続または取り外した瞬間を検出したいと考えています。どうすればこれを行うことができますか?

4

2 に答える 2

6

あなたの答えはクォーツにあります。

#include <ApplicationServices/ApplicationServices.h>

CGError CGDisplayRegisterReconfigurationCallback (
    CGDisplayReconfigurationCallBack proc,
    void *userInfo
);

そして、あなたのprocは次のようになります:

 MyCGDisplayReconfigurationCallBack(
    CGDirectDisplayID display,
    CGDisplayChangeSummaryFlags flags,
    void *userInfo) {
    
    if (flags & kCGDisplayAddFlag || flags & kCGDisplayRemoveFlag) {
        DoStuff(display, flags, userInfo);
    }
}

Swift5の場合:

extension ScreenDetector {

    static let callback: CGDisplayReconfigurationCallBack = { (displayId, flags, userInfo) in
        guard let opaque = userInfo else {
            return
        }
        let mySelf = Unmanaged<ScreenDetector>.fromOpaque(opaque).takeUnretainedValue()
        
        if flags.contains(.addFlag) {
            //Add Display...
        }else if flags.contains(.removeFlag) {
            //Removed Display...
        }
        
    }

    func addObervers() {
        let userData = Unmanaged<ScreenDetector>.passUnretained(self).toOpaque()
        CGDisplayRegisterReconfigurationCallback(ScreenDetector.callback, userData)
    }
    
    func removeObservers() {
        let userData = Unmanaged<ScreenDetector>.passUnretained(self).toOpaque()
        CGDisplayRemoveReconfigurationCallback(ScreenDetector.callback, userData)
    }
}
于 2013-01-24T17:57:36.260 に答える
0

誰かが Swift 2.3 でこれを行うことに興味がある場合は、@iluvcapra のコードを翻訳するためにしばらく頭をかきました。

let userData = UnsafeMutablePointer<ViewController>(Unmanaged.passUnretained(self).toOpaque()) //use the class name of your "self" for future reference inside the callback
CGDisplayRegisterReconfigurationCallback({ (display: UInt32, flags: CGDisplayChangeSummaryFlags, userInfo: UnsafeMutablePointer<Swift.Void>) in
    let mySelf = Unmanaged<ViewController>.fromOpaque(COpaquePointer(userInfo)).takeUnretainedValue() //change here to your class name
    if flags.rawValue & CGDisplayChangeSummaryFlags.AddFlag.rawValue > 0 {
        //do stuff on connect
        mySelf.someFunction()
    } else if flags.rawValue & CGDisplayChangeSummaryFlags.RemoveFlag.rawValue > 0 {
        //do stuff on disconnect
    }
}, userData)
于 2016-12-01T12:41:26.080 に答える