如何在Mac OS X中使用显示ID获取显示名称? [英] How to Get the Display Name with the Display ID in Mac OS X?
问题描述
我想知道您是否可以通过在Mac OS X(10.5)中使用显示ID 号码来帮助我找出如何逐步获取显示器的显示名称 ?一个要求是如果我给一个函数的显示ID,它将提供显示名称作为回报(或反之亦然)。
I was wondering if you could help me figure out how to progmatically get the Display Name for a monitor by using its Display ID number in Mac OS X (10.5)? A requirement is if I give a function the Display ID, it'll provide the Display Name in return (or vice versa).
显示名称看起来像这样:Color LCD,SAMSUNG
Display Name looks something like this: "Color LCD", "SAMSUNG"
显示ID看起来像这样:69671872,893830283
Display ID looks something like this: "69671872", "893830283"
NSScreen 获取显示器的显示ID号。似乎没有一个方法来获取显示名称。不好了!这里是NSScreen的代码获取显示ID:
NSScreen in Cocoa (Obj-C), or CGGetActiveDisplayList in Quartz (C), allow you to get the Display ID number for a monitor. Neither appear to have a method to get the Display Name. Oh no! Here's the code for NSScreen to get the Display ID:
NSArray *screenArray = [NSScreen screens];
NSDictionary *screenDescription = [[screenArray objectAtIndex:0] deviceDescription];
NSLog(@"Device ID: %@", [screenDescription objectForKey:@"NSScreenNumber"]);
System Profiler strong> ,系统偏好设定,显示名称,而非显示ID。
System Profiler, and Displays under System Preferences, reference displays by Display Name, not Display ID.
一个AppleScript,它需要显示名称而不是显示ID。任何帮助是不胜感激! :)
I'm asking as I want to run an AppleScript, and it requires a Display Name rather than a Display ID. Any help is MUCH appreciated! :)
推荐答案
这将提供本地化的显示名称:
This gives you the localized display name:
static void KeyArrayCallback(const void* key, const void* value, void* context) { CFArrayAppendValue(context, key); }
- (NSString*)localizedDisplayProductName
{
NSDictionary* screenDictionary = [[NSScreen mainScreen] deviceDescription];
NSNumber* screenID = [screenDictionary objectForKey:@"NSScreenNumber"];
CGDirectDisplayID aID = [screenID unsignedIntValue];
CFStringRef localName = NULL;
io_connect_t displayPort = CGDisplayIOServicePort(aID);
CFDictionaryRef dict = (CFDictionaryRef)IODisplayCreateInfoDictionary(displayPort, 0);
CFDictionaryRef names = CFDictionaryGetValue(dict, CFSTR(kDisplayProductName));
if(names)
{
CFArrayRef langKeys = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks );
CFDictionaryApplyFunction(names, KeyArrayCallback, (void*)langKeys);
CFArrayRef orderLangKeys = CFBundleCopyPreferredLocalizationsFromArray(langKeys);
CFRelease(langKeys);
if(orderLangKeys && CFArrayGetCount(orderLangKeys))
{
CFStringRef langKey = CFArrayGetValueAtIndex(orderLangKeys, 0);
localName = CFDictionaryGetValue(names, langKey);
CFRetain(localName);
}
CFRelease(orderLangKeys);
}
CFRelease(dict);
return [(NSString*)localName autorelease];
}
这篇关于如何在Mac OS X中使用显示ID获取显示名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!