编程触发“检测显示器”。
-
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小牛被弃用,它可能是更好通过适当的匹配呼叫像这样获取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);
}
}
不隶属于 StackOverflow