Fortschritt, .NET-Prüfung, Updates, Fenster merken, Box-Funktionen
- Große Kopien laufen im Hintergrund mit Fortschritt und Abbrechen; abgebrochene Kopien werden aufgeräumt, das Original bleibt unverändert - Sichern/Wiederherstellen mit Fortschritt, keine halben ZIP-Dateien - Installer auf .NET Framework 4.8: erkennt fehlende .NET 9 Desktop Runtime und installiert sie auf Wunsch (Microsoft-Signatur wird geprüft) - Update-Hinweis über Gitea-Releases, Update mit automatischem Neustart - Fenstergröße und -position werden gemerkt - Desktop-Boxen: umbenennen, löschen, verschieben, herausziehen - Fenster und Boxen kehren auf sichtbare Bildschirme zurück - README ergänzt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+39
@@ -0,0 +1,39 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace DeskCore;
|
||||
|
||||
/// <summary>Bildschirm-Hilfen, damit Fenster nie außerhalb des sichtbaren Bereichs landen (z. B. nach Abstecken eines Monitors).</summary>
|
||||
public static class Screens
|
||||
{
|
||||
/// <summary>Umrechnung Pixel → WPF-Einheiten (System-DPI).</summary>
|
||||
private static double Scale
|
||||
{
|
||||
get
|
||||
{
|
||||
using var g = System.Drawing.Graphics.FromHwnd(IntPtr.Zero);
|
||||
return g.DpiX / 96.0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Arbeitsbereiche (ohne Taskleiste) aller angeschlossenen Bildschirme in WPF-Einheiten.</summary>
|
||||
public static List<Rect> WorkAreas()
|
||||
{
|
||||
var s = Scale;
|
||||
return System.Windows.Forms.Screen.AllScreens
|
||||
.Select(m => new Rect(m.WorkingArea.X / s, m.WorkingArea.Y / s, m.WorkingArea.Width / s, m.WorkingArea.Height / s))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public static Rect PrimaryWorkArea => SystemParameters.WorkArea;
|
||||
|
||||
/// <summary>Ist genug vom Fenster (Titelleiste) auf irgendeinem Bildschirm sichtbar, um es greifen zu können?</summary>
|
||||
public static bool IsReachable(Rect window)
|
||||
{
|
||||
var title = new Rect(window.X, window.Y, window.Width, Math.Min(40, window.Height));
|
||||
return WorkAreas().Any(a =>
|
||||
{
|
||||
var i = Rect.Intersect(a, title);
|
||||
return !i.IsEmpty && i.Width >= Math.Min(120, window.Width / 2) && i.Height >= 20;
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user