Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 以编程方式触发“;检测显示器。”;_Objective C_Macos_Resolution_Iokit - Fatal编程技术网

Objective c 以编程方式触发“;检测显示器。”;

Objective c 以编程方式触发“;检测显示器。”;,objective-c,macos,resolution,iokit,Objective C,Macos,Resolution,Iokit,我试图触发系统在“显示”系统首选项窗格中单击“检测显示”时所做的相同操作。有没有一种方法可以通过编程实现这一点?我的目标是创建一个LaunchAgent,在登录时执行此操作,以重置显示分辨率,以防用户弄乱它。您需要使用专用CoreGraphics例程获取所有显示(包括非活动显示)的列表,然后请求重新扫描总线。试着这样做: #include <IOKit/IOKitLib.h> #include <IOKit/IOTypes.h> CGDisplayErr CGSGetD

我试图触发系统在“显示”系统首选项窗格中单击“检测显示”时所做的相同操作。有没有一种方法可以通过编程实现这一点?我的目标是创建一个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);
  }
 }
}
#包括
#包括
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;)