2010-01-17 6 views
2

I ’ m en essayant de déclencher la même chose que le système lorsque vous cliquez sur “ Détecter Affiche ” dans “ Affiche le volet ” Préférences système. Y a-t-il un moyen de faire cela par programme? Mon but est de créer un LaunchAgent qui le fait lors de la connexion pour réinitialiser la résolution d'affichage au cas où un utilisateur dérangerait avec elle.Déclencher par programme "détecter les affichages".

Répondre

3

Vous devrez utiliser une routine CoreGraphics privée pour obtenir la liste de tous les affichages, y compris ceux qui sont inactifs, puis demander une nouvelle analyse du bus. Essayez-le 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); 
    } 
} 
} 

Et lien vers ApplicationServices et IOKit.

+0

Désolé, il m'a fallu si longtemps pour répondre, je devait arriver à l'endroit où je pourrais tester cela. Cela a fonctionné, mais je recommande quelques changements. Tout d'abord, ajoutez la ligne '#include ', ce qui vous permet de changer 'CGSGetDisplayList' (en supprimant sa déclaration) en' CGGetOnlineDisplayList' et d'obtenir l'achèvement du code dans Xcode. –

+0

Okay, super. Je n'avais aucun écran externe à tester et je ne savais pas si vous pouviez utiliser CGGetOnlineDisplayList au lieu de CGSGetDisplayList. Je sais que CGSGetDisplayList renvoie tous les affichages, qu'ils soient en ligne ou non (il retournait 4 affichages sur mon MacBook Pro) alors que CGGetOnlineDisplayList en renvoyait seulement un. Si cela fonctionne avec CGGetOnlineDisplayList, alors il vaut mieux éviter l'API privée;) –

4

Depuis le CGDisplayIOServicePort appel 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); 
    } 
} 
Questions connexes