C#: 완전한 데스크톱 크기를 원하시나요?

전체 데스크톱의 크기는 어떻게 알 수 있나요? **'작업 영역'과 '화면 해상도'는 모두 하나의 화면만을 나타냅니다. 각 모니터에 일부만 표시되는 가상 데스크톱의 전체 너비와 높이를 알고 싶습니다.

질문에 대한 의견 (1)
해결책

두 가지 옵션이 있습니다.

    • 프레센테이션프라임워k.들러 1.

시스템파람터s.버추알스린위드스 시스템파람터s.버추알스크렌하이트

    • 시스템.빈다우스스퍼 s.들러 2.

시스템린퍼마션.버추알스크린스위드스 시스템린퍼마션.버추알스크린스게이트

    • 최초로 옵션을 사용할 경우 WPF 응용 프로그램 개발.
해설 (1)

이제 하나의 표현식으로 전체 데스크톱 크기를 쉽게 구할 수 있는 약간의 LINQ를 사용하여 이 답변을 최신 상태로 만들어야 할 때라고 생각합니다.

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

제 원래 답변은 다음과 같습니다:


나는 당신이 원하는 것이 이와 같은 것이라고 생각합니다:

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);

이것이 모든 것을 말해주지는 않는다는 점을 명심하세요. 여러 모니터를 엇갈리게 배치하거나 직사각형이 아닌 모양으로 배열할 수 있습니다. 따라서 (최소, 최소)와 (최대, 최대) 사이의 공간이 모두 표시되지 않을 수 있습니다.

편집:

방금 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);
해설 (1)

확인:

SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height
해설 (0)

이것은 질문에 대한 답은 아니지만 모든 화면 내에서 창 포인트(위치)에 대한 추가 통찰력을 추가할 뿐입니다.)

아래 코드를 사용하여 포인트(예: 마지막으로 알려진 창 위치)가 전체 데스크톱의 범위 내에 있는지 확인하세요. 그렇지 않은 경우 창의 위치를 기본값인 pBaseLoc으로 재설정하세요;

코드가 작업 표시줄이나 다른 도구 모음을 고려하지 않는다면 직접 설정하세요.

사용 예: 스테이션 A에서 창 위치를 데이터베이스에 저장합니다. 사용자가 모니터가 2개인 스테이션 B에 로그인하여 창을 두 번째 모니터로 이동하고 새 위치를 저장한 후 로그아웃합니다. 다시 스테이션 A로 돌아오면 위의 코드를 사용하지 않으면 창이 표시되지 않습니다.

제가 추가로 해결한 방법은 사용자 ID와 스테이션의 IP(& winLoc)를 데이터베이스 또는 특정 앱의 로컬 사용자 환경 설정 파일에 저장한 다음 해당 스테이션 및 앱에 대한 사용자 환경 설정을 로드하는 것이었습니다.

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;
해설 (2)

실제 이 모니터의 afaq 픽셀 크기를 사용할 수 있습니다.

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);
    }

}
해설 (1)

'의' 시스템스트로이 니며 사용할 수 있습니다.

이 같은 기능을 하도록 만들 수 있습니다.

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

그리고 화면 하나, 둘, 등에 비해 다음과 같은 변수로 구할 수 있습니다.

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

그런 다음 니며 내려받습니다 화면:

System.Drawing.Rectangle screen1Bounds = screen1.Bounds;

이와 같은 '코드', '높이' 등 모든 속성 너버 얻을 수 있습니다.

해설 (0)

이 방법은 모두 포함된 되돌려줍니다 사각형에는 screens& # 39. 가장 낮은 값을 사용하여 니며 Top, 가장 높은 값을 왼쪽 및 오른쪽 아래.

5 988 {{{000}}}

해설 (2)

내가 생각하는 가장 좋은 방법은 &quot 내려받습니다 real"; 화면 크기, 직접 비디오 컨트롤러 값을 얻을 수 있다.

    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);
                }
            }
        }
}

이 작업을 어떻게해야합니다;) 반갑도다.

해설 (0)
    • 크기 가상 표시 없이 종속물과의 내려받습니다
public enum SystemMetric
{
    VirtualScreenWidth = 78, // CXVIRTUALSCREEN 0x0000004E 
    VirtualScreenHeight = 79, // CYVIRTUALSCREEN 0x0000004F 
}

[DllImport("user32.dll")]
public static extern int GetSystemMetrics(SystemMetric metric);

public static Size GetVirtualDisplaySize()
{
    var width = GetSystemMetrics(SystemMetric.VirtualScreenWidth);
    var height = GetSystemMetrics(SystemMetric.VirtualScreenHeight);

    return new Size(width, height);
}
해설 (0)