2

「ディスプレイ」システム環境設定ペインで「ディスプレイの検出」をクリックしたときにシステムが実行するのと同じことをトリガーしようとしています。これをプログラムで行う方法はありますか?私の目標は、ログイン時にこれを実行するLaunchAgentを作成して、ユーザーがそれを台無しにした場合に表示解像度をリセットすることです。

4

2 に答える 2

4

このCGDisplayIOServicePort呼び出しはOSX10.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);
    }
}
于 2013-12-10T19:51:41.917 に答える
3

非アクティブなディスプレイを含むすべてのディスプレイのリストを取得するには、プライベート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にリンクします。

于 2010-01-18T23:11:53.143 に答える