2009-08-22 37 views
65

Làm cách nào để tìm hiểu kích thước của toàn bộ màn hình? Không phải "khu vực làm việc" và không phải là "độ phân giải màn hình", cả hai đều chỉ tham chiếu một màn hình. Tôi muốn tìm hiểu tổng chiều rộng và chiều cao của màn hình ảo mà mỗi màn hình chỉ hiển thị một phần.C#: Nhận kích thước máy tính để bàn hoàn chỉnh?

+2

Có thể "kích thước màn hình hoàn chỉnh" sẽ tùy thuộc vào cách đặt màn hình. Bạn không chắc chắn làm thế nào để tính toán đó, nhưng bạn vẫn có thể nắm bắt số lượng màn hình và độ phân giải của mỗi màn hình với System.Windows.Forms.Screen.AllScreens. – Havenard

Trả lời

119

Bạn có hai lựa chọn:

  1. PresentationFramework.dll

    SystemParameters.VirtualScreenWidth 
    SystemParameters.VirtualScreenHeight 
    
  2. Hệ thống.Windows.Forms.dll

    SystemInformation.VirtualScreen.Width 
    SystemInformation.VirtualScreen.Height 
    

Sử dụng đầu tiên lựa chọn nếu bạn đang phát triển một ứng dụng WPF.

+0

Thêm câu trả lời như thế này! Ngắn, chính xác và thẩm mỹ! – Bitterblue

26

Tôi nghĩ đã đến lúc đưa câu trả lời này cập nhật lên một chút LINQ, giúp dễ dàng có được toàn bộ kích thước màn hình với một biểu thức duy nhất.

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

câu trả lời ban đầu của tôi sau:


Tôi đoán những gì bạn muốn là một cái gì đó như thế này:

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

Hãy ghi nhớ rằng điều này không nói lên toàn bộ câu chuyện. Nó có thể cho nhiều màn hình được so le, hoặc sắp xếp theo một hình dạng không phải hình chữ nhật. Do đó, có thể không phải tất cả khoảng cách giữa (minx, miny) và (maxx, maxy) đều hiển thị.

EDIT:

Tôi chỉ nhận ra rằng các mã có thể là một chút đơn giản sử dụng 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); 
+2

Tôi là lập trình viên người Ukraine. Tôi đang xác minh rằng mã này đang hoạt động từ hộp. Chỉ cần sao chép và dán. –

5

này không trả lời câu hỏi, nhưng chỉ đơn thuần là thêm cái nhìn sâu sắc thêm về điểm a của cửa sổ (vị trí) trong tất cả các màn hình).

Sử dụng mã bên dưới để tìm hiểu xem Điểm (ví dụ: Vị trí cửa sổ đã biết cuối cùng) nằm trong giới hạn của Tổng thể trên màn hình. Nếu không, hãy đặt lại Vị trí của cửa sổ thành mặc định pBaseLoc;

Mã không tính đến Thanh tác vụ hoặc Thanh công cụ khác, yer trên yer của chính bạn ở đó.

Ví dụ sử dụng: Lưu vị trí cửa sổ vào cơ sở dữ liệu từ đài A. Người dùng đăng nhập vào đài B với 2 màn hình và di chuyển cửa sổ sang màn hình thứ hai, đăng xuất để lưu vị trí mới. Quay lại đài A và cửa sổ sẽ không được hiển thị trừ khi mã trên được sử dụng.

Giải quyết thêm của tôi đã thực hiện lưu ID người dùng và IP của trạm (& winLoc) vào cơ sở dữ liệu hoặc tệp prefs người dùng cục bộ cho một ứng dụng nhất định, sau đó tải người dùng vào ứng dụng &.

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; 
+6

Nếu bạn * biết * rằng điều này không trả lời được câu hỏi, tại sao bạn đăng câu hỏi đó làm câu trả lời cho câu hỏi? Không phải câu đầu tiên đã rung chuông báo động sao? – Timwi

+1

Mặt khác, đây là chính xác những gì tôi đang tìm kiếm khi tôi tìm kiếm về chủ đề này –

14

Kiểm tra:

SystemInformation.VirtualScreen.Width 
SystemInformation.VirtualScreen.Height 
0

Bạn có thể sử dụng Giới hạn số System.Drawing.

Bạn có thể tạo một hàm như thế này

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

và hơn bạn có thể có được một màn hình, hai, vv trong một biến như thế này:

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

sau đó bạn có thể nhận được các giới hạn của màn hình:

System.Drawing.Rectangle screen1Bounds = screen1.Bounds; 

với mã này, bạn sẽ nhận được tất cả các thuộc tính như Width , Height vv

0

Phương pháp này trả về hình chữ nhật có chứa tất cả các giới hạn của màn hình bằng cách sử dụng các giá trị thấp nhất cho Left và Top, và những giá trị cao nhất cho phải và dưới ...

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

Vui lòng giải thích một chút. –

+0

Nó lặp qua tất cả các màn hình. Nếu cạnh trái nhỏ hơn biến 'l', nó đặt 'l' thành giá trị mới này, nếu cạnh dưới lớn hơn 'b' thì nó sẽ đặt nó. Kết quả cuối cùng là l, t, r, b được đặt ở bên trái, trên, bên phải và dưới cùng của toàn bộ màn hình hiển thị của bạn. – dynamichael

0

Tôi nghĩ cách tốt nhất để có được kích thước màn hình "thực" là lấy các giá trị trực tiếp từ bộ điều khiển video.


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

này nên thực hiện công việc;) Chúc mừng ...

4

Để có được kích thước pixel vật lý của màn hình, bạn có thể sử dụng này.

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


} 
Các vấn đề liên quan