Soru C #: Masaüstü boyutunun tamamını alın?


Tüm masaüstünün boyutunu nasıl bulabilirim? Değil "çalışma alanı" ve değil Her ikisi de sadece bir ekrana atıfta bulunan "ekran çözünürlüğü". Her monitörün sadece bir parçası olduğunu gösteren sanal masaüstünün toplam genişliğini ve yüksekliğini öğrenmek istiyorum.


68
2017-08-22 22:41


Menşei


Belki "tam masaüstü boyutu" ekranların nasıl yerleştirildiğine bağlı olacaktır. Bunu nasıl hesaplayacağınızdan emin değilsiniz, ancak yine de her bir ekranın ekran ve çözünürlüğünü System.Windows.Forms.Screen.AllScreens ile yakalayabilirsiniz. - Havenard


Cevaplar:


İki seçeneğiniz var:

  1. PresentationFramework.dll

    SystemParameters.VirtualScreenWidth   
    SystemParameters.VirtualScreenHeight
    
  2. System.Windows.Forms.dll

    SystemInformation.VirtualScreen.Width   
    SystemInformation.VirtualScreen.Height
    

Kullan ilk seçenek Bir WPF uygulaması geliştiriyorsanız.


121
2017-11-08 17:53



Bunun gibi cevapların daha fazlası! Kısa, doğru ve estetik olarak hoş! - Bitterblue


Bence bu cevabı küçük bir LINQ ile bugüne kadar getirmenin zamanı geldi, bu da tüm masaüstü boyutunu tek bir ifade ile almayı kolaylaştırıyor.

Console.WriteLine(
    Screen.AllScreens.Select(screen=>screen.Bounds)
    .Aggregate(Rectangle.Union)
    .Size
);

Orijinal cevabım şöyle:


Sanırım istediğin şey şu:

int minx, miny, maxx, maxy;
minx = miny = int.MaxValue;
maxx = maxy = int.MinValue;

foreach(Screen screen in Screen.AllScreens){
    var bounds = screen.Bounds;
    minx = Math.Min(minx, bounds.X);
    miny = Math.Min(miny, bounds.Y);
    maxx = Math.Max(maxx, bounds.Right);
    maxy = Math.Max(maxy, bounds.Bottom);
}

Console.WriteLine("(width, height) = ({0}, {1})", maxx - minx, maxy - miny);

Bunun bütün hikayeyi anlatmadığını unutmayın. Birden fazla monitörün katlanması veya dikdörtgen olmayan bir şekilde düzenlenmesi mümkündür. Bu nedenle, (minx, miny) ve (maxx, maxy) arasındaki boşluğun tamamı görünmeyebilir.

DÜZENLE:

Sadece kodun biraz daha basit olabileceğini fark ettim Rectangle.Union:

Rectangle rect = new Rectangle(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue);

foreach(Screen screen in Screen.AllScreens)
    rect = Rectangle.Union(rect, screen.Bounds);

Console.WriteLine("(width, height) = ({0}, {1})", rect.Width, rect.Height);

26
2017-08-22 22:55



Ben Ukraynalı programcıyım. Bu kodun kutudan çalıştığını doğrularım. Sadece kopyala yapıştır. - Vova Popov


Kontrol:

SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height

15
2018-03-07 09:17





Bu soruya cevap vermiyor, ama sadece bir pencerenin tüm ekranları içindeki Noktası (konumu) hakkında ek bilgiler ekler.

Bir Nokta'nın (ör. Pencerenin bilinen son yeri) genel Masaüstü'nün sınırları içinde olup olmadığını öğrenmek için aşağıdaki kodu kullanın. Değilse, pencerenin Konumunu varsayılana sıfırlayın pBaseLoc;

Kod, TaskBar veya diğer Araç Çubuklarını hesaba katmaz.

Örnek Kullanım: Pencere konumunu istasyon A. Kullanıcı giriş yapar istasyon B 2 monitörle pencereyi 2. monitöre taşır, yeni konumu kaydetmeyi kaydeder. Geri istasyon A ve yukarıdaki kod kullanılmadığı sürece pencere gösterilmeyecektir.

Benim daha fazla özüm, userID ve istasyonun IP'sini (& winLoc) belirli bir uygulama için veritabanına veya yerel kullanıcı prefs dosyasına kaydetmeye çalıştı, ardından o istasyon ve uygulama için kullanıcı pref dosyasına yüklendi.

Point pBaseLoc = new Point(40, 40)
int x = -500, y = 140;
Point pLoc = new Point(x, y);
bool bIsInsideBounds = false;

foreach (Screen s in Screen.AllScreens)
{
    bIsInsideBounds = s.Bounds.Contains(pLoc);
    if (bIsInsideBounds) { break; }
}//foreach (Screen s in Screen.AllScreens)

if (!bIsInsideBounds) { pLoc = pBaseLoc;  }

this.Location = pLoc;

5
2017-07-29 18:35



Eğer sen bilmek Bunun soruyu cevaplamadığını, neden soruyu bir cevap olarak gönderiyorsunuz? İlk cümle bir alarm zili çalmadı mı? - Timwi
Diğer yandan, bu konuyla ilgili arama yaparken tam da aradığım şey buydu. - Simon Gillbee


Monitörün fiziksel piksel boyutunu elde etmek için bunu kullanabilirsiniz.

static class DisplayTools
{
    [DllImport("gdi32.dll")]
    static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

    private enum DeviceCap
    {
        Desktopvertres = 117,
        Desktophorzres = 118
    }

    public static Size GetPhysicalDisplaySize()
    {
        Graphics g = Graphics.FromHwnd(IntPtr.Zero);
        IntPtr desktop = g.GetHdc();

        int physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.Desktopvertres);
        int physicalScreenWidth = GetDeviceCaps(desktop, (int)DeviceCap.Desktophorzres);

        return new Size(physicalScreenWidth, physicalScreenHeight);
    }


}

5
2018-04-27 11:28





Sınırları kullanabilirsiniz System.Drawing.

Böyle bir işlev oluşturabilirsiniz

public System.Windows.Form.Screen[] GetScreens(){
    Screen[] screens = Screen.AllScreens;
    return screens;
}

ve bunun gibi bir değişkenin ekranını bir, iki, vb.

System.Windows.Form.Screen[] screens = func.GetScreens();
System.Windows.Form.Screen screen1 = screens[0];

sonra ekranın sınırlarını alabilirsiniz:

System.Drawing.Rectangle screen1Bounds = screen1.Bounds;

Bu kod ile tüm özellikleri Width, Height, vb.


0
2018-01-16 15:43





"Gerçek" ekran boyutunu elde etmenin en iyi yolunun, değerleri doğrudan video denetleyiciden alması olduğunu düşünüyorum.


    using System;
    using System.Management;
    using System.Windows.Forms;

    namespace MOS
    {
        public class ClassMOS
        {
            public static void Main()
            {
                try
                {
                    ManagementObjectSearcher searcher = 
                        new ManagementObjectSearcher("root\\CIMV2", 
                        "SELECT * FROM Win32_VideoController"); 

                    foreach (ManagementObject queryObj in searcher.Get())
                    {
                        Console.WriteLine("CurrentHorizontalResolution: {0}", queryObj["CurrentHorizontalResolution"]);
                        Console.WriteLine("-----------------------------------");
                        Console.WriteLine("CurrentVerticalResolution: {0}", queryObj["CurrentVerticalResolution"]);
                    }
                }
                catch (ManagementException e)
                {
                    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
                }
            }
        }
}

Bu işi yapmalı;) Selamlar ...


0
2017-12-10 17:28





Bu yöntem, tüm ekranların sınırlarını içeren dikdörtgeni, Sol ve Üst için en düşük değerleri ve Sağ ve Alt için en yüksek değerleri kullanarak döndürür ...

static Rectangle GetDesktopBounds() {
   var l = int.MaxValue;
   var t = int.MaxValue;
   var r = int.MinValue;
   var b = int.MinValue;
   foreach(var screen in Screen.AllScreens) {
      if(screen.Bounds.Left   < l) l = screen.Bounds.Left  ;
      if(screen.Bounds.Top    < t) t = screen.Bounds.Top   ;
      if(screen.Bounds.Right  > r) r = screen.Bounds.Right ;
      if(screen.Bounds.Bottom > b) b = screen.Bounds.Bottom;
   }
   return Rectangle.FromLTRB(l, t, r, b);
}

0
2018-02-11 05:37



Lütfen biraz açıkla. - Syeda Zunairah
Tüm ekranlardan geçiyor. Eğer sol kenar 'l' değişkeninden daha az ise, 'l' değerini bu yeni değere ayarlar, eğer alt kenar 'b' den daha büyükse, bunu ayarlar. Sonuçta l, t, r, b görünür masaüstünüzün sol, üst, sağ ve alt kenarlarına ayarlanır. - dynamichael