Программно активировать «обнаружение дисплеев».
-
21-09-2019 - |
Вопрос
Я пытаюсь запустить то же самое, что система делает, когда вы нажимаете «Определить дисплеи» на панели системных настроек «Дисплеи».Есть ли способ сделать это программно?Моя цель — создать LaunchAgent, который будет делать это при входе в систему и сбрасывать разрешение экрана на случай, если пользователь с ним запутается.
Решение
Вам нужно будет использовать частную процедуру 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.
Другие советы
Поскольку 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);
}
}