Die akzeptierte Antwort wurde geändert, um die beste Vorgehensweise von WPF widerzuspiegeln. System.Windows.SystemParameters. *
chilltemp
1
Die Besessenheit, keinen WinForms-Namespace zu verwenden, scheint mir seltsam, es bringt Ihnen nichts; Stattdessen haben Sie nicht die Werkzeuge, die Sie zur ordnungsgemäßen Lösung des Problems benötigen.
Jeff Yates
4
Für mich geht es nicht um WinForms vs. WPF. Es geht darum, etwas Neues zu lernen. Ich kann mich nicht entscheiden, welcher Weg besser ist, wenn ich nicht beide Wege lerne.
Chilltemp
3
Nun, in diesem Szenario gibt es keine "beide Möglichkeiten", da es nur eine Möglichkeit gibt, dies zu tun, nämlich das WinForms-Zeug zu verwenden.
Jeff Yates
@ Jeff Yates: Du bist richtig. Ich habe das ursprüngliche Projekt ausgegraben, für das ich diese Frage gestellt habe, und festgestellt, dass ich die PrimaryScreen * -Eigenschaften verwendet habe. Sie haben meine Bedürfnisse des Tages gelöst, aber nicht die eigentliche Frage, die ich gestellt habe. Entschuldigung für das Durcheinander; Ich habe die akzeptierte Antwort entsprechend geändert.
Chilltemp
Antworten:
143
Screen.FromControl, Screen.FromPointUnd Screen.FromRectangleSie sollten dabei helfen. Zum Beispiel in WinForms wäre es:
Vielleicht hat mein Tagging nicht deutlich gemacht, dass ich WPF-Fenster verwende, nicht WinForms. Ich habe nicht auf die System.Windows.Forms.dll verwiesen, und es würde sowieso nicht funktionieren, da WPF einen eigenen Vererbungsbaum hat.
Chilltemp
1
Bitte. Ich entschuldige mich dafür, dass ich nicht direkt zur Antwort gekommen bin. Ich musste untersuchen, was in WPF verfügbar war, bevor ich meinen Beitrag aktualisierte.
Jeff Yates
Dies funktioniert, um ein Fenster am rechten Rand zu platzieren: var bounds = this.GetScreen (). WorkingArea; this.Left = bounds.Right - this.Width; Es sind jedoch Verweise auf System.Windows.Forms und System.Drawing erforderlich, was nicht ideal ist.
Anthony
1
@devios Beachten Sie, dass dieser Anruf nicht DPI-fähig ist. Sie müssen Berechnungen durchführen.
Lynn Crumbling
6
In meinem VS 2015 WPF - Anwendung .NET 4.5 auf meinem 4-Monitor - System auf Windows 10 Pro (v10.0.14393) mit der Ausrichtung windowauf dem Monitor über meiner Primary ist ( zum Beispiel seines Top < 0), FromHandlekehrte das Screenallerdings für meinen primärer Monitor (selbst windowwar vollständig innerhalb der sekundäre Monitor)!?! Seufzer. Es sieht so aus, als Screen.AllScreensmüsste ich das Array selbst durchsuchen . Warum können Dinge nicht "einfach funktionieren"?!? Arrrrgh.
Tom
62
Sie können dies verwenden, um Desktop-Arbeitsbereichsgrenzen des primären Bildschirms abzurufen:
Ich bin verwirrt ... Dies scheint nur die primären Bildschirmabmessungen zurückzugeben. Ich möchte wissen, wie
groß
1
Dies beantwortet die Frage nicht und selbst wenn Sie nur die Größe der primären Anzeige erhalten möchten, sind die Systemparameter (in WPF) falsch. Sie geben geräteunabhängige Einheiten und keine Pixel zurück. Für eine bessere Implementierung siehe diese Antwort: stackoverflow.com/questions/254197/…
Patrick Klug
1
PrimaryScreenHeight / Width funktionierte genau wie erwartet, und MSDN enthält Folgendes: "Ruft einen Wert ab, der die Bildschirmhöhe des primären Anzeigemonitors in Pixel angibt." WorkArea sagt nicht speziell Pixel, aber die Dokumentation und Verwendungsbeispiele lassen mich glauben, dass es auch in Pixel ist. Haben Sie einen Link zu etwas, das auf die Verwendung geräteunabhängiger Einheiten hinweist?
Hinweis: Um es zu verwenden, muss man die Referenz hinzufügen PresentationFramework.dllundusing System.Windows;
Matt
17
Hinzufügen einer Lösung, die stattdessen nicht WinForms, sondern NativeMethods verwendet. Zuerst müssen Sie die erforderlichen nativen Methoden definieren.
Achten Sie auf den Skalierungsfaktor Ihrer Fenster (100% / 125% / 150% / 200%). Sie können die tatsächliche Bildschirmgröße mithilfe des folgenden Codes ermitteln:
Das ist für den primären Bildschirm - was ist, wenn sich Ihr App-Fenster auf einem virtuellen (erweiterten) Bildschirm befindet (dh Sie haben einen oder zwei externe Monitore an Ihren PC angeschlossen)?
Matt
4
Ich wollte die Bildschirmauflösung vor dem Öffnen des ersten meiner Fenster haben, daher hier eine schnelle Lösung, um ein unsichtbares Fenster zu öffnen, bevor die Bildschirmabmessungen tatsächlich gemessen werden (Sie müssen die Fensterparameter an Ihr Fenster anpassen, um sicherzustellen, dass beide geöffnet sind der gleiche Bildschirm - hauptsächlich WindowStartupLocationist das wichtig)
PrivateSubWindow_Loaded(ByVal sender AsSystem.Object,ByVal e AsSystem.Windows.RoutedEventArgs)HandlesMyBase.LoadedDimBarWidthAsDouble=SystemParameters.VirtualScreenWidth-SystemParameters.WorkArea.WidthDimBarHeightAsDouble=SystemParameters.VirtualScreenHeight-SystemParameters.WorkArea.HeightMe.Left=(SystemParameters.VirtualScreenWidth-Me.ActualWidth-BarWidth)/2Me.Top=(SystemParameters.VirtualScreenHeight-Me.ActualHeight-BarHeight)/2EndSub
Die Hauptfrage betrifft die Bildschirmposition. Wie das Msi-Installationsprogramm, Innosetup oder andere habe ich mein eigenes Installationsprogramm mit CPU-Prüfung, Berechtigungsprüfung, Treiberüberprüfung und vielem mehr erstellt, das sehr einfach zu bedienen ist. Das ist der Screenshot über.
Nasenbaer
3
Ich musste die maximale Größe meiner Fensteranwendung festlegen. Dieser könnte entsprechend geändert werden. Die Anwendung wird im primären Bildschirm oder im sekundären angezeigt. Um dieses Problem zu lösen, haben wir eine einfache Methode erstellt, die ich Ihnen als Nächstes zeige:
/// <summary>/// Set the max size of the application window taking into account the current monitor/// </summary>publicstaticvoidSetMaxSizeWindow(ioConnect _receiver){Point absoluteScreenPos = _receiver.PointToScreen(Mouse.GetPosition(_receiver));if(System.Windows.SystemParameters.VirtualScreenLeft==System.Windows.SystemParameters.WorkArea.Left){//Primary Monitor is on the Leftif(absoluteScreenPos.X <=System.Windows.SystemParameters.PrimaryScreenWidth){//Primary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.WorkArea.Height;}else{//Secondary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.VirtualScreenWidth-System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.VirtualScreenHeight;}}if(System.Windows.SystemParameters.VirtualScreenLeft<0){//Primary Monitor is on the Rightif(absoluteScreenPos.X >0){//Primary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.WorkArea.Height;}else{//Secondary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.VirtualScreenWidth-System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.VirtualScreenHeight;}}}
In C # -Winforms habe ich einen Startpunkt (für den Fall, dass wir mehrere Monitore / Diplomaten haben und ein Formular einen anderen aufruft) mit Hilfe der folgenden Methode:
Fügen Sie alle Anzeigen mit Screen.AllScreens in ein Array oder eine Liste ein und erfassen Sie dann den Index der aktuellen Anzeige und ihre Eigenschaften.
C # (von Telerik von VB konvertiert - bitte überprüfen)
Antworten:
Screen.FromControl
,Screen.FromPoint
UndScreen.FromRectangle
Sie sollten dabei helfen. Zum Beispiel in WinForms wäre es:Ich kenne keinen entsprechenden Anruf für WPF. Daher müssen Sie so etwas wie diese Erweiterungsmethode ausführen.
quelle
window
auf dem Monitor über meiner Primary ist ( zum Beispiel seinesTop < 0
),FromHandle
kehrte dasScreen
allerdings für meinen primärer Monitor (selbstwindow
war vollständig innerhalb der sekundäre Monitor)!?! Seufzer. Es sieht so aus, alsScreen.AllScreens
müsste ich das Array selbst durchsuchen . Warum können Dinge nicht "einfach funktionieren"?!? Arrrrgh.Sie können dies verwenden, um Desktop-Arbeitsbereichsgrenzen des primären Bildschirms abzurufen:
System.Windows.SystemParameters.WorkArea
Dies ist auch nützlich, um nur die Größe des primären Bildschirms zu ermitteln:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
quelle
Möglicherweise benötigen Sie auch:
um die kombinierte Größe aller Monitore und nicht eines bestimmten zu erhalten.
quelle
PresentationFramework.dll
undusing System.Windows;
Hinzufügen einer Lösung, die stattdessen nicht WinForms, sondern NativeMethods verwendet. Zuerst müssen Sie die erforderlichen nativen Methoden definieren.
Und dann holen Sie sich den Monitorgriff und die Monitorinformationen wie folgt.
quelle
Add zu ffpf
quelle
Achten Sie auf den Skalierungsfaktor Ihrer Fenster (100% / 125% / 150% / 200%). Sie können die tatsächliche Bildschirmgröße mithilfe des folgenden Codes ermitteln:
quelle
Ich wollte die Bildschirmauflösung vor dem Öffnen des ersten meiner Fenster haben, daher hier eine schnelle Lösung, um ein unsichtbares Fenster zu öffnen, bevor die Bildschirmabmessungen tatsächlich gemessen werden (Sie müssen die Fensterparameter an Ihr Fenster anpassen, um sicherzustellen, dass beide geöffnet sind der gleiche Bildschirm - hauptsächlich
WindowStartupLocation
ist das wichtig)quelle
Dies ist eine "Center Screen DotNet 4.5-Lösung ", die SystemParameters anstelle von System.Windows.Forms oder My.Compuer.Screen verwendet : Da Windows 8 die Berechnung der Bildschirmabmessungen geändert hat, sieht es für mich nur so aus (Taskleistenberechnung) inbegriffen):
quelle
Ich musste die maximale Größe meiner Fensteranwendung festlegen. Dieser könnte entsprechend geändert werden. Die Anwendung wird im primären Bildschirm oder im sekundären angezeigt. Um dieses Problem zu lösen, haben wir eine einfache Methode erstellt, die ich Ihnen als Nächstes zeige:
quelle
In C # -Winforms habe ich einen Startpunkt (für den Fall, dass wir mehrere Monitore / Diplomaten haben und ein Formular einen anderen aufruft) mit Hilfe der folgenden Methode:
quelle
WinForms
Für Multi-Monitor-Setups benötigen Sie außerdem ein Konto für die X- und Y-Position:
quelle
Dieser Debugging- Code sollte den Trick gut machen:
Sie können die Eigenschaften der Bildschirmklasse untersuchen
Fügen Sie alle Anzeigen mit Screen.AllScreens in ein Array oder eine Liste ein und erfassen Sie dann den Index der aktuellen Anzeige und ihre Eigenschaften.
C # (von Telerik von VB konvertiert - bitte überprüfen)
VB (Originalcode)
quelle