2008-10-17 24 views
5

Tôi đang cố gỡ lỗi một sự cố lạ với người dùng đã cài đặt LogMeIn. Sau một vài ngày, một số hộp thoại của tôi mà ứng dụng của tôi mở ra có thể kết thúc trên màn hình. Nếu tôi có thể phát hiện ra điều đó một cách đáng tin cậy, tôi có thể di chuyển các hộp thoại một cách có lập trình trở lại nơi chúng được hiển thị lại.Cách xác định xem ứng dụng Windows có tắt màn hình không?

Lưu ý: điều này phải làm việc cho nhiều màn hình và sử dụng API win32. Tuy nhiên, nếu bạn biết cách thực hiện điều đó từ .NET. Tôi có thể ngoại suy từ đó ...

Cập nhật: Vì tò mò, lỗi được đề cập ở trên phải làm với wxWidgets. Nếu bạn chạy một ứng dụng wxWidgets, sau đó đi bộ và để cho trình bảo vệ màn hình của bạn đi, sau đó đăng nhập từ xa với LogMeIn, sau đó thử mở một hộp thoại từ ứng dụng của bạn, bạn sẽ gặp rắc rối nếu bạn sử dụng wxDisplay :: GetFromPoint (pos) hoặc wxWindowBase :: Center() để định vị hộp thoại.

+0

FYI: Nhấp chuột phải vào cửa sổ tắt trên thanh tác vụ, chọn di chuyển và nhấn phím mũi tên (cần di chuyển chuột). Sau đó, sử dụng chuột hoặc các phím để hoàn thành việc di chuyển. – Aardvark

+0

ALT + Space cũng hoạt động. – kgriffs

+0

Nếu bạn nghĩ rằng đó là một lỗi trong wxWidgets, bạn đã báo cáo nó chưa? –

Trả lời

8

Chỉ cần sử dụng MonitorFromWindow với cờ MONITOR_DEFAULTTONULL. Nếu giá trị trả về là null, cửa sổ của bạn không hiển thị. Sau đó, bạn có thể vượt qua MONITOR_DEFAULTTONEAREST để có thể đặt lại vị trí cửa sổ của mình trên màn hình gần nhất.

+0

Xóa câu trả lời của tôi - cờ MONITOR_DEFAULTTONULL có vẻ hoàn hảo ... – Aardvark

+0

Tôi đã kết thúc bằng cách sử dụng MonitorFromPoint, hoạt động tương tự như MonitorFromWindow. – kgriffs

-1

Hmm. Điều này có thể không giúp đỡ, nhưng khi tôi đã làm VB, bạn có thể làm screen.width và screen.height, và sau đó window.x và window.y ...

Tất nhiên, tôi không biết làm thế nào mà làm việc với nhiều màn hình.

1

Trong .NET, bạn sử dụng cấu trúc Screen.PrimaryScreen.WorkingArea để lấy các giới hạn của màn hình chính (Screen.Screens [x] .WorkingArea cho các màn hình khác, tôi nghĩ), và sau đó sử dụng các thuộc tính Trái và Trên của cửa sổ để tìm ra nơi cửa sổ (nếu nó tắt màn hình, trên cùng và bên trái sẽ lớn hơn [Màn hình] .Width và .Height.

1

Trong .NET, tôi sẽ lặp trên mỗi màn hình trong màn hình. AllScreen, sau đó hoặc gọi screen.Bounds.Contains() đi qua hình chữ nhật của biểu mẫu nếu bạn muốn đảm bảo tất cả cửa sổ của bạn nằm trong giới hạn (*) hoặc gọi screen.Bounds.IntersectsWith() nếu bạn chỉ muốn đảm bảo ít nhất một phần trong biểu mẫu của bạn hiển thị.

(*) Không hoàn toàn nằm trong giới hạn một màn hình không có nghĩa là nó không nằm trong giới hạn của toàn màn hình. Bạn cũng có thể gọi Rectangle.Union trên mỗi giới hạn màn hình để tạo ra một hình chữ nhật duy nhất để kiểm tra hình chữ nhật của bạn chống lại, nhưng sau đó bạn phải xem ra nếu giới hạn màn hình không có cùng kích thước, vì hình chữ nhật englobing là không hoàn toàn có thể nhìn thấy hoặc.

Đó là câu trả lời dài hơn. Cái ngắn hơn là: Không có cách nào dễ dàng tôi biết.

0

Có vẻ như GetMonitorInfo() là tương đương Win32 của đề xuất của Danny. Tôi không chắc chắn làm thế nào bạn muốn đi về một HMONITOR cho tất cả các màn hình trên hệ thống, nhưng có vẻ như ví dụ liên kết từ tài liệu có một số cách để làm điều đó.

1

Bất kể bạn làm gì, hãy tính toán cho nhiều màn hình có thể có tọa độ cách xa hàng nghìn pixel (0,0) theo bất kỳ hướng nào. Tôi ghét nó khi một ứng dụng buộc chính nó trở lại màn hình khác, thường xuyên làm rối tung mọi trò chơi toàn màn hình mà tôi có thể vào lúc đó.

1

Xem thêm How can I get the active screen dimensions?

Đây là mã tôi đã sử dụng trong các nhà xây dựng hình thức đó là một quickie để di chuyển các hình thức cho một màn hình hiển thị sau khi bạn undock máy tính xách tay của bạn hoặc bất cứ điều gì nó là bạn đã thực hiện một số màn hình bất động sản đi xa. Tinh chỉnh mức tiêu thụ của riêng bạn.

if (!Screen.FromControl(this).Bounds.Contains(this.Location)) 
      { 
       this.DesktopLocation = new Point(100,100); 
      } 
Các vấn đề liên quan