Last active
July 16, 2024 03:07
-
-
Save AiziChen/6d5e75f36084cb2e2fda84e110375d6b to your computer and use it in GitHub Desktop.
Get display name and display mode from NSScreen
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// MainMonitor.swift | |
// swift-test-app | |
// | |
// Created by quanye on 10/26/21. | |
// | |
extension NSScreen { | |
/** | |
Get the monitor name of `Screen` | |
- Returns: monitor name | |
*/ | |
@objc func monitorName() -> String? { | |
guard let displayID = | |
deviceDescription[NSDeviceDescriptionKey(rawValue: "NSScreenNumber")] as? CGDirectDisplayID else { | |
return nil | |
} | |
guard let info = CoreDisplay_DisplayCreateInfoDictionary(displayID).takeRetainedValue() as? [String: AnyObject] else { | |
return nil | |
} | |
if let productName = info["DisplayProductName"] as? [String: String] { | |
return productName["en_US"] | |
} | |
return nil | |
} | |
/** | |
Get the monitor type by monitor name | |
- Parameter name: monitor name | |
- Returns: monitor-type | |
*/ | |
@objc func monitorType() -> MonitorType? { | |
let rs = MonitorType() | |
guard let displayID = | |
deviceDescription[NSDeviceDescriptionKey(rawValue: "NSScreenNumber")] as? CGDirectDisplayID else { | |
return nil | |
} | |
guard let info = CoreDisplay_DisplayCreateInfoDictionary(displayID).takeRetainedValue() as? [String: AnyObject] else { | |
return nil | |
} | |
if let productName = info["DisplayProductName"] as? [String: String], | |
let monitorName = productName["en_US"] { | |
rs.name = monitorName | |
let isMain = CGDisplayIsMain(displayID) | |
let isBuiltIn = CGDisplayIsBuiltin(displayID) | |
let isHardwareMirror = CGDisplayIsInHWMirrorSet(displayID) | |
if (isMain == 1 && isBuiltIn == 1 && isHardwareMirror == 0) { | |
// 内建屏幕,并且没有扩展 | |
rs.mode = "内建屏幕,无模式" | |
} else if (isMain == 0 && isBuiltIn == 0 && isHardwareMirror == 0) { | |
// 外接屏幕,且为扩展模式 | |
rs.mode = "外接屏幕,扩展模式" | |
} else if (isMain == 0 && isBuiltIn == 1 && isHardwareMirror == 0) { | |
// 内建屏幕,且为扩展模式 | |
rs.mode = "内建屏幕,扩展模式" | |
} else if (isMain == 0 && isBuiltIn == 0 && isHardwareMirror == 1) { | |
// 外接屏幕,复制模式 | |
rs.mode = "外接屏幕,复制模式" | |
} else if (isMain == 1 && isBuiltIn == 0 && isHardwareMirror == 0) { | |
rs.mode = "外接屏幕,无模式" | |
} else if (isMain == 1 && isBuiltIn == 0 && isHardwareMirror == 1) { | |
rs.mode = "外接屏幕,复制模式" | |
} else { | |
rs.mode = "未知" | |
} | |
} | |
return rs; | |
} | |
} | |
public class MonitorType: NSObject { | |
var name: String? | |
var mode: String? | |
@objc func getName() -> String? { | |
return name | |
} | |
@objc func getMode() -> String? { | |
return mode | |
} | |
} | |
public class CheckMonitor: NSObject { | |
/** | |
获取所有的显示器名列表 | |
- Returns: monitors list | |
*/ | |
@objc public func allMonitorNames() -> NSMutableArray { | |
let rs = NSMutableArray() | |
for screen in NSScreen.screens { | |
if let name = screen.monitorName() { | |
rs.add(name) | |
} | |
} | |
return rs | |
} | |
/** | |
是否为主显示器? | |
- Parameter name: 显示器名 | |
- Returns: true if is main-monitor, or else is not | |
*/ | |
@objc public func isMainMonitor(_ name: String) -> Bool { | |
return NSScreen.main?.monitorName() == name | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment