2009-07-13 30 views
31

Tôi có một ứng dụng C# Windows mà tôi muốn đảm bảo sẽ hiển thị trên màn hình thứ hai nếu người dùng di chuyển nó đến một. Tôi cần lưu kích thước, vị trí và trạng thái cửa sổ của biểu mẫu chính - mà tôi đã xử lý - nhưng tôi cũng cần biết màn hình nào đã được bật khi người dùng đóng ứng dụng.Làm cách nào để xác định xem chương trình .NET Windows Forms của tôi đang chạy trên màn hình nào?

Tôi đang sử dụng lớp Màn hình để xác định kích thước của màn hình hiện tại nhưng tôi không thể tìm thấy bất kỳ thứ gì về cách xác định ứng dụng đang chạy trên màn hình nào.

Chỉnh sửa: Cảm ơn câu trả lời, mọi người! Tôi muốn xác định màn hình cửa sổ đã bật để tôi có thể kiểm tra giới hạn trong trường hợp người dùng vô tình đặt cửa sổ bên ngoài khu vực xem hoặc thay đổi kích thước màn hình sao cho biểu mẫu sẽ không hiển thị hoàn toàn nữa.

+0

Nếu đây không phải là một câu hỏi tương tự để http://stackoverflow.com/questions/937298/restoring-window-size -kết hợp với nhiều màn hình – sgmoore

Trả lời

46

Bạn có thể nhận được một mảng màn hình mà bạn đã sử dụng mã này.

Screen[] screens = Screen.AllScreens; 

Bạn cũng có thể hình dung ra màn hình nào bạn đang ở trên, bằng cách chạy mã này ( đây là cửa sổ hình bạn đang ở trên)

Screen screen = Screen.FromControl(this); //this is the Form class 

trong ngắn hạn kiểm tra lớp Screen và tĩnh phương pháp trợ giúp, họ có thể giúp bạn.

MSDN Link, không có nhiều .. Tôi khuyên bạn nên tự làm rối tung mã trong mã.

+0

Có, mọi người dường như quên rằng Biểu mẫu kế thừa từ Kiểm soát , vì vậy Screen.FromControl sẽ làm việc trên nó. – Powerlord

+4

Có lẽ tôi nên nói lại rằng ... Kế thừa mẫu từ ContainerControl, kế thừa từ ScrollableControl, kế thừa từ Kiểm soát. – Powerlord

+0

Điều này hoàn toàn sai – Janie

6

Nếu bạn nhớ vị trí và kích thước của cửa sổ, điều đó sẽ là đủ. Khi bạn thiết lập vị trí cho vị trí đã sử dụng trước đó, nếu nó xảy ra trên màn hình thứ hai, nó sẽ quay trở lại đó. Ví dụ, nếu bạn có 2 màn hình, cả hai kích thước 1280x1024 và bạn đặt vị trí trái của cửa sổ là 2000px, nó sẽ xuất hiện trên màn hình thứ hai (giả sử màn hình thứ hai nằm bên phải màn hình đầu tiên.) :)

Nếu bạn đang lo lắng về màn hình thứ hai đã không ở đó khi ứng dụng được khởi động thời gian tiếp theo, bạn có thể sử dụng phương pháp này để xác định xem cửa sổ của bạn cắt bất kì màn hình:

private bool isWindowVisible(Rectangle rect) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
    { 
     if (screen.Bounds.IntersectsWith(rect)) 
      return true; 
    } 
    return false; 
} 

Chỉ cần vượt qua trong vị trí mong muốn của cửa sổ của bạn và nó sẽ cho bạn biết nếu nó sẽ được hiển thị trên một trong các màn hình. Thưởng thức!

+1

đồng ý, nhưng một số kiểm tra lúc khởi động sẽ tốt đẹp, do đó sau khi cấu hình lại ứng dụng của bạn sẽ không nằm ngoài tất cả màn hình –

+0

Thực ra, nếu ai đó xóa màn hình thứ hai và ứng dụng của bạn sẽ cố gắng sử dụng Top/Left từ phiên trước khi có hai màn hình, Windows sẽ tự động chuyển nó sang màn hình đầu tiên. Vì vậy, thực tế, bạn không cần phải gọi phương thức isWindowVisible. – SolutionYogi

+0

Tôi đồng ý Henk - kiểm tra ví dụ tôi đã thêm để bạn có thể kiểm tra xem cửa sổ của bạn có hiển thị hay không. :) –

0

Bạn có thể sử dụng 'Screen' đối tượng: System.Windows.Forms.Screen

Bắt đầu chơi với một cái gì đó như thế này:

 Screen[] screens = Screen.AllScreens; 
     for (int i = 0; i < screens.Length ; i++) 
     { 
      Debug.Print(screens[i].Bounds.ToString()); 
      Debug.Print(screens[i].DeviceName); 
      Debug.Print(screens[i].WorkingArea.ToString()); 
     } 

Nó có thể giúp bạn có được những gì bạn cần

4

Bạn có thể lấy màn hình hiện tại với

var s = Screen.FromControl(this); 

nơi this là Form (hoặc bất kỳ điều khiển trên Form). Về làm thế nào để nhớ rằng đó là một chút khôn lanh, nhưng tôi sẽ đi cho các chỉ số trong mảng Screen.AllScreens, hoặc có thể s.DeviceName. Trong cả hai trường hợp, hãy kiểm tra trước khi sử dụng các thiết lập khi khởi động, để tránh sử dụng màn hình bị ngắt kết nối.

+1

tôi sẽ không đi cho DeviceName, DeviceName có thể thay đổi bất cứ lúc nào, nói khi bạn nhận được một card màn hình mới hoặc màn hình ... –

+0

Tôi nhận được chúng như \\. \ DISPLAY1 và \\. \ DISPLAY2, trên Vista. Nhưng nó có thể khác với XP, tôi không chắc. –

+0

Tôi đồng ý, không ai thực sự chắc chắn .. đó là lý do tại sao tôi sẽ không sử dụng nó. :) –

3

Vị trí của biểu mẫu sẽ cho bạn biết màn hình nào đang bật. Tôi không thực sự hiểu tại sao bạn cần phải biết màn hình của nó là gì, bởi vì nếu bạn khôi phục lại nó bằng cách sử dụng vị trí bạn đã lưu nó chỉ cần khôi phục lại cùng một vị trí (có thể bạn có thể mở rộng là tại sao).

Nếu không, bạn có thể làm một cái gì đó như thế này:

Screen[] scr = Screen.AllScreens; 
scr[i].Bounds.IntersectsWith(form.Bounds); 

Mỗi màn hình có một tài sản Bounds mà trả về một Rectangle. Bạn có thể sử dụng hàm IntersectsWith() để xác định xem biểu mẫu có nằm trong màn hình hay không.

Ngoài ra, họ về cơ bản cung cấp một chức năng mà thực hiện điều này cũng vào lớp Screen

Screen screen = Screen.FromControl(form); 
Các vấn đề liên quan