Domanda

Sto cercando di innescare la stessa cosa che il sistema fa quando si fa clic su “Rileva Monitor” nel riquadro “visualizza” Preferenze di Sistema. C'è un modo per fare questo a livello di codice? Il mio obiettivo è quello di creare un LaunchAgent che fa questo in login per ripristinare la risoluzione dello schermo nel caso in cui un utente pasticci con esso.

È stato utile?

Soluzione

Sarà necessario utilizzare una routine di CoreGraphics privato per ottenere l'elenco di tutti i display, tra cui quelle inattive, e quindi richiedere una nuova analisi del bus. Prova in questo modo:

#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);
  }
 }
}

E link per ApplicationServices e IOKit.

Altri suggerimenti

Dal momento che la chiamata CGDisplayIOServicePort è stato deprecato in OS X 10.9 Mavericks, può essere meglio per acquisire il servizio di IOFramebuffer attraverso una chiamata in corrispondenza adeguata in questo modo:

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top