Programmatische auslösen „-Displays erkennen.“
-
21-09-2019 - |
Frage
Ich versuche, die gleiche Sache zu triggern, dass das System funktioniert, wenn Sie auf „Anzeigen erkennen“ im „Displays“ Systemeinstellungen Bereich. Gibt es eine Möglichkeit, diese programmatisch zu tun? Mein Ziel ist es, eine LaunchAgent zu erstellen, die bei der Anmeldung tut dies der Bildschirmauflösung bei einer Benutzer Verwirrungen damit zurückgesetzt werden.
Lösung
Sie müssen ein eigenes Core Graphics Routine verwenden, um die Liste aller Displays einschließlich inaktiven zu bekommen, und fordern Sie anschließend eine erneute Prüfung des Busses. Probieren Sie es wie folgt aus:
#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);
}
}
}
Und Link zu Application und IOKit.
Andere Tipps
Da die CGDisplayIOServicePort
Anruf in OS X 10.9 Mavericks veraltet, kann es besser sein, die IOFramebuffer angebotenen Dienst durch eine entsprechende Abstimmung Aufruf zu erwerben wie folgt:
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);
}
}