2010-01-17 4 views
2

I ’ m пытается вызвать ту же самую вещь, что система делает, когда вы нажимаете на “ Обнаружение дисплеев ” в “ Отображается ” Системные настройки панели. Есть ли способ сделать это программно? Моя цель - создать LaunchAgent, который делает это при входе в систему, чтобы сбросить разрешение экрана, если пользователь столкнулся с ним.Программно запускать «обнаружение дисплеев».

ответ

3

Для получения списка всех дисплеев, включая неактивные, вам потребуется использовать приватную процедуру CoreGraphics, а затем запросить повторное сканирование шины. Попробуйте следующее:

#include <IOKit/IOKitLib.h> 
#include <IOKit/IOTypes.h> 

CGDisplayErr CGSGetDisplayList(CGDisplayCount maxDisplays, 
            CGDirectDisplayID * onlineDspys, 
            CGDisplayCount * dspyCnt); 
static void DetectDisplays() 
{ 
CGDirectDisplayID displays[8]; 
    CGDisplayCount dspCount = 0; 

if (CGSGetDisplayList(8, displays, &dspCount) == noErr) 
{ 
    for(int i = 0; i < dspCount; i++) 
    { 
    io_service_t service = CGDisplayIOServicePort(displays[i]); 
    if (service) 
    IOServiceRequestProbe(service, kIOFBUserRequestProbe); 
    } 
} 
} 

И ссылка на ApplicationsServices и IOKit.

+0

К сожалению он взял меня так долго, чтобы ответить, я пришлось добраться туда, где я мог проверить это. Это сработало, но я рекомендую пару изменений. Во-первых, добавьте строку '#include ', которая позволяет вам изменить 'CGSGetDisplayList' (удаление его декларации) на' CGGetOnlineDisplayList' и получить код в Xcode. –

+0

Хорошо, отлично. У меня не было никаких внешних дисплеев для тестирования, и я не был уверен, можно ли использовать CGGetOnlineDisplayList вместо CGSGetDisplayList. Я знаю, что CGSGetDisplayList возвращает все отображения, независимо от того, находятся они в сети или нет (он возвращал 4 дисплея на моем MacBook Pro), тогда как CGGetOnlineDisplayList возвращал только один. Если это работает с CGGetOnlineDisplayList, то лучше избегать частного API;) –

4

Поскольку CGDisplayIOServicePort вызов устаревшим в OS X 10.9 Mavericks, это может быть лучше приобрести услугу IOFramebuffer через соответствующий соответствующий вызов таким образом:

void triggerDetectDisplays() 
{ 
    // loop over all IOFramebuffer services 
    CFMutableDictionaryRef matchingDict = IOServiceMatching("IOFramebuffer"); 

    mach_port_t masterPort; 
    IOMasterPort(MACH_PORT_NULL, &masterPort); 
    io_iterator_t serviceIterator; 
    IOServiceGetMatchingServices(masterPort, matchingDict, &serviceIterator); 

    io_service_t obj = IOIteratorNext(serviceIterator); 
    while (obj) 
    { 
     kern_return_t kr = IOServiceRequestProbe(obj, 0); 
     obj = IOIteratorNext(serviceIterator); 
    } 
} 
Смежные вопросы