c++ - ظهور - تعداد الشاشات على جهاز كمبيوتر



تغيير دقة الشاشة في ويندوز 10 (2)

لقد وجدت 7 طرق مختلفة لتعداد الشاشات المتصلة بالكمبيوتر. لكن جميع الحلول تعطي نتائج مختلفة (عدد الشاشات والمعلومات الموجودة على كل شاشة).

هذه الحلول هي:

  1. باستخدام EnumDisplayDevices الشهيرة

  2. باستخدام EnumDisplayMonitors

  3. باستخدام Windows Management Instrumentation (WMI) :
    باستخدام الاستعلام التالي: SELECT * FROM WmiMonitorID في مساحة اسم root\\WMI .

  4. مرة أخرى باستخدام WMI :
    باستخدام الاستعلام الجديد: SELECT * FROM Win32_DesktopMonitor في مساحة الاسم root\\CIMV2 .

  5. باستخدام واجهة برمجة تطبيقات الإعداد :
    عن طريق استدعاء SetupDiGetClassDevs أولاً لاسترداد مجموعة معلومات الجهاز ، ثم التكرار باستخدام SetupDiEnumDeviceInfo

  6. استخدام البنية الأساسية لرسومات DirectX (DXGI)
    مع IDXGIFactory::EnumAdapters الأول ، ثم IDXGIAdapter::EnumOutput

  7. استخدام واجهات برمجة التطبيقات (Connect and Displays) (CCD) :
    QueryDisplayConfig (QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);

لقد حاولت أن أفهم على وجه التحديد الفرق بين جميع أساليب الرسائل باستخدام مرجع MSDN ، دون جدوى.

الملاحظات

مما لاحظته:

  • استعلامات WmiMonitorID و إعداد API بإرجاع قائمة يعرض (غير نشط بالضرورة) يعرض.
  • استعلام Win32_DesktopMonitor WMI إرجاع نتيجة خاطئة (على الأقل غير متوقع) نتيجة (مراقب واحد فقط تعداد حتى عندما غير نشط و سطح المكتب على جهاز آخر).
  • إرجاع EnumDisplayDevices قائمة الأجهزة النشطة (باستثناء عندما يكون هناك جهاز واحد نشط فقط مع جهاز آخر متصل)
  • إرجاع EnumDisplayMonitors واستعلامات DXGI قائمة الشاشات النشطة.
  • يبدو أن اتفاقية مكافحة التصحر هي الطريقة الأكثر موثوقية (تعطي جميع المسارات الممكنة بين الأهداف والمصادر).

الأسئلة

ما النتيجة التي يجب توقعها حقًا عند استخدام كل طريقة من هذه الطرق (قائمة العروض المتصلة ، قائمة العروض المثبتة ، قائمة العروض النشطة)؟ ماذا لو استخدمت الشاشات المتطابقة أو الشاشات الموسعة؟ ماذا لو كان لدى الكمبيوتر بطاقات رسومات متعددة بدون مخرجات متعددة؟

المكافأة: بعض الطرق ( DXGI ، EnumDisplayDevices ، CCD ) تستخدم نوعًا من التسلسل الهرمي مع Adapter - Monitor . ولكن لا تعطي نفس الروابط بين المحولات والشاشات. إذن ، ما هو تعريف محول DXGI ؟ لاتفاقية مكافحة التصحر ؟ ل EnumDisplayDevices ؟

https://ffff65535.com


في حال كان ذلك مناسبًا QGuiApplication::screens() ، عند استخدام Qt 5.x ، يمكنك استخدام طريقة QGuiApplication::screens() ( http://qt-project.org/doc/qt-5.1/qtgui/qguiapplication.html#screens ) لتعداد جميع العروض.

أو إذا لم تكن ذات صلة ، فيمكنك دائمًا إلقاء نظرة على الكود المصدر ، وكيفية تعداد شاشات العرض والحصول على جميع الخصائص ذات الصلة (أيضًا فيما يتعلق بالنسخ المتطابق ، وأسطح المكتب الموسعة ، وما إلى ذلك).


لا أعرف كل من واجهات برمجة التطبيقات هذه ، لكنني أتذكر بعضها (ذكريات سيئة) ، فإليك ما يمكنني أن أتذكره وأجده من الدخول في MSDN واللعب باستخدام wbemtest وهو ما أدهشني حتى أنني أتذكره. أدرك أن هذه الإجابة ليست على الأرجح كل ما كنت تأمل فيه.

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

إذا ذهبت إلى خصائص العرض ، أرى شاشة واحدة فقط.

متصلا CIMv2

select * from Win32_DesktopMonitor;

إرجاع حالتين.

DesktopMonitor1 هو العرض الخارجي (GenericPNPDisplay) و DesktopMonitor1 هو الشاشة الافتراضية (الشاشة).

متصلا root \ WMI

select * from WMIMonitorID;

يعطيني مثيل واحد فقط وهذا المثيل هو الشاشة الخارجية (أعرف ذلك لأن اسم الشركة المصنعة هو HP). (HWP26CE هو معرف HP w2408 ، انظر here )

ثم ، هناك فرق بين محولات أجهزة العرض والشاشات. يعرض لك EnumDisplayDevices المحولات ويعرض لك EnumDisplayMonitors الشاشات. الأول هو في المقام الأول مجرد تعداد المحولات ولكن الأخير يسمح لك بتوفير مستطيل القطع وتحديد أجهزة المراقبة التي يحدث فيها مستطيل القطع. يصبح هذا مفيدًا عندما يكون لديك شاشات متعددة نشطة ويقرر شخص ما القيام بشيء يؤدي إلى رسم يؤدي إلى تجميع أجهزة عرض متعددة. يمكنك تحديد رد EnumDisplayMonitors على EnumDisplayMonitors وسيتم استدعاء ذلك رد EnumDisplayMonitors مع بعض المعلمات (إذا كانت الذاكرة EnumDisplayMonitors بشكل صحيح كانت إحدى المعلمات مجموعة فرعية من مستطيل لقطة المحدد الذي يهبط على جهاز العرض المحدد).

أتذكر بشكل غامض SetupDiEnumDeviceInfo وأعتقد أنه يمنحك HDEVINFO لكل واجهة وبالتالي فإنه (في اعتقادي) يمنحك إدخال واحد فقط على التكوين الخاص بي لأن لدي محول واحد فقط. ثم عليك القيام بشيء ما للحصول على SP_DEVINFO_DATA .

لم أستخدم DirectX وواجهة برمجة التطبيقات (API) الأخرى ، لذا سأصمت عن هذين. نأمل شخص آخر يمكن أن تصل حول هذين ، وربما تحصل على إجابة كاملة!





dxgi