Программно вызвать «Обнаружение дисплеев». - PullRequest
2 голосов
/ 17 января 2010

Я пытаюсь вызвать то же самое, что и система, когда вы нажимаете «Обнаружить дисплеи» на панели «Системные настройки» «Дисплеи».Есть ли способ сделать это программно?Моя цель состоит в том, чтобы создать LaunchAgent, который делает это при входе в систему, чтобы сбросить разрешение экрана в случае, если пользователь с ним не справляется.

Ответы [ 2 ]

4 голосов
/ 10 декабря 2013

Поскольку вызов 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);
    }
}
3 голосов
/ 19 января 2010

Вам потребуется использовать частную подпрограмму 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);
  }
 }
}

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

...