我试图触发同样的事情,当你在“显示器”系统偏好设置面板点击“检测显示器”系统一样。有没有一种方法以编程方式做到这一点?我的目标是创建一个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小牛被弃用,它可能是更好通过适当的匹配呼叫像这样获取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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top