Có cách nào để xác định xem một cửa sổ WPF đang mở có hiển thị trên màn hình được kết nối của máy tính để bàn không? Bằng cách nhìn thấy tôi có nghĩa là hình chữ nhật viền của cửa sổ giao nhau với hình chữ nhật trên màn hình của bất kỳ màn hình nào.Xác định xem một cửa sổ WPF đang mở có hiển thị trên bất kỳ màn hình nào
Tôi cần chức năng này để xác định xem cửa sổ cần được định vị lại vì cấu hình màn hình (giới hạn khu vực làm việc, số giám sát) đã thay đổi giữa lần khởi động lại ứng dụng của tôi (tiết kiệm vị trí cửa sổ).
tôi đã đưa ra mã dưới đây và có vẻ như để làm việc, nhưng nó có một số vấn đề:
- Tôi cần phải tham khảo các cửa sổ hình thức.
- Tôi cần cài đặt DPI của máy tính để bàn và chuyển đổi các cửa sổ tạo các pixel thực tế thành pixel ảo WPF.
- Tôi cần một cá thể Hình ảnh rõ ràng đã được hiển thị để thực hiện phép chuyển đổi.
Bạn có biết giải pháp loại bỏ một số hoặc tất cả 3 vấn đề ở trên không?
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Media;
internal static class Desktop
{
private static Size dpiFactor = new Size(1.0, 1.0);
private static bool isInitialized;
public static IEnumerable<Rect> WorkingAreas
{
get
{
return
Screen.AllScreens.Select(
screen =>
new Rect(
screen.WorkingArea.Left * dpiFactor.Width,
screen.WorkingArea.Top * dpiFactor.Height,
screen.WorkingArea.Width * dpiFactor.Width,
screen.WorkingArea.Height * dpiFactor.Height));
}
}
public static void TryInitialize(Visual visual)
{
if (isInitialized)
{
return;
}
var ps = PresentationSource.FromVisual(visual);
if (ps == null)
{
return;
}
var ct = ps.CompositionTarget;
if (ct == null)
{
return;
}
var m = ct.TransformToDevice;
dpiFactor = new Size(m.M11, m.M22);
isInitialized = true;
}
}
Cách sử dụng của (khởi tạo) Desktop
lớp:
private bool IsLocationValid(Rect windowRectangle)
{
foreach (var workingArea in Desktop.WorkingAreas)
{
var intersection = Rect.Intersect(windowRectangle, workingArea);
var minVisible = new Size(10.0, 10.0);
if (intersection.Width >= minVisible.Width &&
intersection.Height >= minVisible.Height)
{
return true;
}
}
return false;
}
Cập nhật
Sử dụng màn hình ảo (SystemParameters.VirtualScreen*
) không làm việc vì khi sử dụng nhiều màn hình các "máy tính để bàn "không phải là một hình chữ nhật đơn giản. Nó có thể là một đa giác. Sẽ có điểm mù trong màn hình ảo vì
- màn hình kết nối có thể có độ phân giải khác nhau
- bạn có thể cấu hình vị trí của mỗi màn hình.
http: // stackoverflow.com/questions/2465646/how-do-i-know-what-monitor-a-wpf-cửa sổ-là-trong – Flot2011
Mặc dù câu hỏi từ liên kết đó là khá giống nhau, nó không trả lời câu hỏi của tôi. Tôi đã đề xuất một giải pháp và tôi muốn tìm một cách để khám phá ra khỏi ba vấn đề tôi đã đề cập. – bitbonk
Sau đó, các thư viện WPF và C# tiêu chuẩn không thể giúp bạn. Bạn có thể thử PInvoke, nhưng đó có lẽ là bẩn hơn. Xem câu hỏi này để biết thêm về điều đó: http://stackoverflow.com/questions/1927540/how-to-get-the-size-of-the-current-screen-in-wpf – AkselK