سؤال

هل من الممكن لتمكين جهاز العرض الثاني برمجيا وتمديد سطح المكتب ويندوز على ذلك في C #؟ عليه أن يفعل ما يعادل تشغيل خانة الاختيار في الصورة أدناه.

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

المحلول

MSDN وظائف سياق الجهاز

وماذا تحتاج في الأساس إلى القيام به:

<اقتباس فقرة>   

استخدم في EnumDisplayDevices) دعوة API (   تعداد أجهزة العرض على   النظام ونظرة لتلك التي   لا يوجد لديك   DISPLAY_DEVICE_ATTACHED_TO_DESKTOP   مجموعة العلم (وهذا سوف تتضمن أي   يعكس الأجهزة لذلك ليس كل شيء سيكون   يعرض المادية.) مرة واحدة كنت قد وجدت   جهاز العرض ستحتاج إلى الحصول على   وضع عرض صالح لتغييره إلى،   يمكنك العثور على هذا عن طريق استدعاء   EnumDisplaySettingsEx () دعوة API -   عموما كنت عرض جميع   وسائط المتاحة، وتسمح للمستخدم ل   اختيار ولكن في حالتك يبدو   مثل هذا قد يكون من الممكن رمز الصعب   ويوفر لك خطوة إضافية. إلى عن على   من أجل مستقبل العازلة الخاصة بك   تطبيق الرغم من أنني كنت أقترح وجود   هذا للتغيير بسهولة دون الحاجة   لحفر من خلال مصدر كل مرة،   فإن مفتاح التسجيل يكون واضح   خيار. مرة واحدة كنت قد حصلت على مرتبة   من ملء عرض DEVMODE   هيكل بالمعلومات حول   وضعية الشاشة (تعيين   PelsWidth / الارتفاع، الوظيفة،   DisplayFrequency وBitsPerPel   خصائص) ثم تعيين هذه العلامات في   عضو المجالات. استدعاء أخيرا   ChangeDisplaySettingsEx () مع هذا   هيكل الإعدادات والتأكد من أن ترسل   إعادة تعيين وتحديث الأعلام التسجيل.   يجب أن يكون كل ما تحتاجه، نأمل أن يكون هذا   يساعد،

DISPLAY_DEVICE هيكل الواردات باستخدام PInvoke

EnumDisplayDevices وظيفة استيراد

EnumDisplaySettingsEx وظيفة استيراد

وغيرها. ويمكن الاطلاع على من تبقى منهم وظائف مع بحث بسيط بالاسم.

نصائح أخرى

إذا كان لديك ويندوز 7، ثم نبدأ عملية:

    private static Process DisplayChanger = new Process
    {
        StartInfo =
        {
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = "DisplaySwitch.exe",
            Arguments = "/extend"
        }
    };

وبعد ذلك DisplayChanger.Start ()؛

وليس لدي إجابة كاملة هنا ولكن أنا متأكد تقريبا أنه سيكون لديك لدعوة من صافي للقيام بذلك. سيكون لديك لاستخدام Pinvoke إلى استدعاء DLL غير المدارة. وهناك موارد كبيرة لهذا هو pinvoke.net.

ولقد فعلت ذلك لبحث سريع وجدت HTTP: //www.pinvoke. صافي / default.aspx / USER32 / ChangeDisplaySettings.html الذي هو على الارجح ليس بالضبط ما تريد ولكن قد تجد في مكان ما على pinvoke.net

وأنا أبحث عن حل نفسه. كنت قد كتبت رمز التالي للاتصال ChangeDisplaySettingsEx مع PInvoke:

DEVMODE dm = new DEVMODE();
dm.dmSize = (short)Marshal.SizeOf(dm);
dm.dmPelsWidth = 1680;
dm.dmPelsHeight = 1050;
dm.dmBitsPerPel = 32;
dm.dmDisplayFrequency = 60;
dm.dmFields = DevModeFields.DM_BITSPERPEL | DevModeFields.DM_PELSWIDTH | 
              DevModeFields.DM_PELSHEIGHT | DevModeFields.DM_DISPLAYFREQUENCY;
int res = ChangeDisplaySettingsEx(@"\\.\DISPLAY2", ref dm, IntPtr.Zero, CDS_RESET | CDS_UPDATEREGISTRY, IntPtr.Zero);
Console.WriteLine("result = " + res.ToString());

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

لتمكين رصد وتحديد موقفها إلى شيء آخر من 0،0، مثل كما هو مبين:

POINTL enabledPosition = new POINTL();
enabledPosition.x = -1280;
enabledPosition.y = 0;

dm.dmPosition = enabledPosition;
dm.dmFields = DM.Position;
res = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, (uint) DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top