Question

Je suis en train de déclencher la même chose que le système ne lorsque vous cliquez sur « Détecter Affiche » dans les Préférences Système « Affiche » volet. Est-il possible de le faire par programme? Mon but est de créer un LaunchAgent qui fait cela lors de la connexion pour réinitialiser la résolution d'affichage dans le cas où un utilisateur mess avec elle.

Était-ce utile?

La solution

Vous aurez besoin d'utiliser une routine CoreGraphics privée pour obtenir la liste de tous les écrans, y compris les inactifs, puis demander une nouvelle analyse du bus. Essayez comme ceci:

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

lien vers ApplicationServices et IOKit.

Autres conseils

Depuis l'appel CGDisplayIOServicePort a été dépréciée dans OS X 10.9 Mavericks, il peut être préférable d'acquérir le service IOFramebuffer par un appel correspondant approprié comme ceci:

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top