Objective c 以编程方式触发“;检测显示器。”;
我试图触发系统在“显示”系统首选项窗格中单击“检测显示”时所做的相同操作。有没有一种方法可以通过编程实现这一点?我的目标是创建一个LaunchAgent,在登录时执行此操作,以重置显示分辨率,以防用户弄乱它。您需要使用专用CoreGraphics例程获取所有显示(包括非活动显示)的列表,然后请求重新扫描总线。试着这样做:Objective c 以编程方式触发“;检测显示器。”;,objective-c,macos,resolution,iokit,Objective C,Macos,Resolution,Iokit,我试图触发系统在“显示”系统首选项窗格中单击“检测显示”时所做的相同操作。有没有一种方法可以通过编程实现这一点?我的目标是创建一个LaunchAgent,在登录时执行此操作,以重置显示分辨率,以防用户弄乱它。您需要使用专用CoreGraphics例程获取所有显示(包括非活动显示)的列表,然后请求重新扫描总线。试着这样做: #include <IOKit/IOKitLib.h> #include <IOKit/IOTypes.h> CGDisplayErr CGSGetD
#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);
}
}
}
#包括
#包括
CGDisplayErr CGSGetDisplayList(CGDisplayCount maxDisplays,
CGDirectDisplayID*onlineDspys,
CGDisplayCount*dspyCnt);
静态空隙检测显示()
{
CGDirectDisplayID显示[8];
CGDisplayCount dspCount=0;
如果(CGSGetDisplayList(8,显示和dspCount)=noErr)
{
对于(int i=0;i
并链接到ApplicationServices和IOKit。由于在OS X 10.9 Mavericks中,
CGDisplayIOServicePort
调用已被弃用,因此最好通过如下适当的匹配调用获取IOFramebuffer服务:
void触发器检测显示()
{
//在所有IOFramebuffer服务上循环
CFMutableDictionaryRef matchingDict=IOServiceMatching(“IOFramebuffer”);
mach_port_t masterPort;
IOMasterPort(马赫数、马赫数和主端口);
io_迭代器\u t服务迭代器;
IOServiceGetMatchingServices(主端口、matchingDict和serviceIterator);
io_service_t obj=IOIteratorNext(serviceIterator);
while(obj)
{
kern_return_t kr=IOServiceRequestProbe(obj,0);
obj=IOIteratorNext(serviceIterator);
}
}
很抱歉,我花了这么长时间才做出回应,我必须去测试一下。它起作用了,但我建议做一些修改。首先,添加行#include
,它允许您将CGSGetDisplayList
(删除其声明)更改为CGGetOnlineDisplayList
,并在Xcode中完成代码。好的,很好。我没有任何要测试的外部显示器,也不确定是否可以使用CGGetOnlineDisplayList而不是CGSGetDisplayList。我知道CGSGetDisplayList返回所有显示,无论它们是否在线(它在我的MacBook Pro上返回了4个显示),而CGGetOnlineDisplayList只返回一个。如果它与CGGetOnlineDisplayList一起工作,那么最好避免使用私有API;)