سؤال

أحاول تشغيل نفس الشيء الذي يفعله النظام عند النقر فوق "اكتشاف شاشات" في جزء تفضيلات نظام "العرض". هل هناك طريقة للقيام بذلك برمجيا؟ هدفي هو إنشاء عملية إطلاق تقوم بذلك عند تسجيل الدخول لإعادة ضبط دقة العرض في حالة تعبئة المستخدم معه.

هل كانت مفيدة؟

المحلول

ستحتاج إلى استخدام روتين خاص أساسي للحصول على قائمة بجميع العروض بما في ذلك العروض غير النشطة ، ثم طلب عملية إعادة إنقاذ للحافلة. جربه مثل هذا:

#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 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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top