Zmieniono zaakceptowaną odpowiedź, aby odzwierciedlić najlepszy sposób zrobienia tego z WPF. System.Windows.SystemParameters. *
chilltemp
1
Obsesja na punkcie nieużywania przestrzeni nazw WinForms wydaje mi się dziwna, nic nie daje; zamiast tego pozostawia Cię bez narzędzi potrzebnych do prawidłowego rozwiązania problemu.
Jeff Yates,
4
Dla mnie nie chodzi o WinForms vs. WPF. Chodzi o nauczenie się czegoś nowego. Nie mogę zdecydować, który sposób jest lepszy, jeśli nie nauczę się obu sposobów.
chilltemp
3
Cóż, w tym scenariuszu nie ma „obu sposobów”, ponieważ jest tylko jeden sposób, aby to zrobić, a mianowicie użycie elementów WinForms.
Jeff Yates,
@Jeff Yates: Masz rację. Wykopałem oryginalny projekt, dla którego zadałem to pytanie, i stwierdziłem, że użyłem właściwości PrimaryScreen *. Rozwiązali moje potrzeby dnia, ale nie pytanie, które zadałem. Przepraszam za bieganie; Odpowiednio zmieniłem zaakceptowaną odpowiedź.
chilltemp
Odpowiedzi:
143
Screen.FromControl, Screen.FromPointI Screen.FromRectanglepowinien w tym pomóc. Na przykład w WinForms byłoby to:
Być może moje tagowanie nie wyjaśniło, że używam okien WPF, a nie WinForms. Nie mam odwołania do System.Windows.Forms.dll, a mimo to nie zadziała, ponieważ WPF ma własne drzewo dziedziczenia.
chilltemp
1
Nie ma za co. Przepraszam, że nie otrzymałem od razu odpowiedzi - musiałem sprawdzić, co było dostępne w WPF, zanim zaktualizowałem mój post.
Jeff Yates,
Działa to w celu umieszczenia okna na prawej krawędzi: var bounds = this.GetScreen (). WorkingArea; this.Left = bounds.Right - this.Width; Ale wymaga odwołań do System.Windows.Forms i System.Drawing, co nie jest idealne.
Anthony
1
@devios Uwaga, to wywołanie nie obsługuje DPI; będziesz musiał wykonać obliczenia.
Lynn Crumbling
6
W mojej aplikacji WPF VS 2015 kierowania .NET 4.5 w moim systemie 4-monitora w systemie Windows 10 Pro (v10.0.14393) z windowmonitora nad moim głównym (np ITS Top < 0), FromHandlepowrócił Screendo mojego głównego monitora (choć windowbył całkowicie w ciągu monitor pomocniczy)!?! Westchnienie. Wygląda na to, że będę musiał sam przeszukać Screen.AllScreensArray. Dlaczego rzeczy nie mogą „po prostu działać”?!? Arrrrgh.
Tom
62
Możesz użyć tego, aby uzyskać granice obszaru roboczego pulpitu na ekranie głównym:
Jestem zdezorientowany… To wydaje się zwracać tylko podstawowe wymiary ekranu. Chcę poznać wymiary ekranu, w którym obecnie znajduje się okno ...
WitalijB
1
nie odpowiada to na pytanie, a nawet jeśli chcesz tylko uzyskać rozmiar podstawowego wyświetlacza, parametry SystemParameters (w WPF) są niepoprawne. zwracają jednostki niezależne od urządzenia, a nie piksele. aby uzyskać lepszą implementację, zobacz tę odpowiedź: stackoverflow.com/questions/254197/ ...
Patrick Klug,
1
PrimaryScreenHeight / Width działały dokładnie zgodnie z oczekiwaniami, a MSDN zawiera następujące informacje: „Pobiera wartość wskazującą wysokość ekranu głównego monitora w pikselach”. WorkArea nie mówi konkretnie o pikselach, ale dokumentacja i przykłady użycia pozwalają mi uwierzyć, że jest to również piksele. Czy masz link do czegoś wskazującego na użycie jednostek niezależnych od urządzenia?
Dotyczy to ekranu głównego - co, jeśli okno aplikacji znajduje się na wirtualnym (rozszerzonym) ekranie (tj. Masz jeden lub dwa zewnętrzne monitory podłączone do komputera)?
Matt
4
Chciałem mieć rozdzielczość ekranu przed otwarciem pierwszego z moich okien, więc tutaj szybkie rozwiązanie, aby otworzyć niewidoczne okno przed faktycznym pomiarem wymiarów ekranu (musisz dostosować parametry okna do swojego okna, aby upewnić się, że oba są otwarte ten sam ekran - przede wszystkim WindowStartupLocationważny)
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
Główne pytanie dotyczy pozycji ekranu. Podobnie jak instalator Msi, Innosetup lub inne, stworzyłem własny instalator z kontrolą procesora, kontrolą uprawnień, weryfikacją sterowników i wieloma innymi, bardzo prostymi w użyciu. O tym jest zrzut ekranu.
Nasenbaer
3
Musiałem ustawić maksymalny rozmiar mojej aplikacji okiennej. Ten można odpowiednio zmienić, aplikacja jest wyświetlana na głównym ekranie lub w drugim. Aby rozwiązać ten problem, stworzyliśmy prostą metodę, którą pokażę dalej:
/// <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;}}}
Odpowiedzi:
Screen.FromControl
,Screen.FromPoint
IScreen.FromRectangle
powinien w tym pomóc. Na przykład w WinForms byłoby to:Nie znam równoważnego wywołania WPF. Dlatego musisz zrobić coś takiego jak ta metoda rozszerzenia.
źródło
window
monitora nad moim głównym (np ITSTop < 0
),FromHandle
powróciłScreen
do mojego głównego monitora (choćwindow
był całkowicie w ciągu monitor pomocniczy)!?! Westchnienie. Wygląda na to, że będę musiał sam przeszukaćScreen.AllScreens
Array. Dlaczego rzeczy nie mogą „po prostu działać”?!? Arrrrgh.Możesz użyć tego, aby uzyskać granice obszaru roboczego pulpitu na ekranie głównym:
System.Windows.SystemParameters.WorkArea
Jest to również przydatne do uzyskania rozmiaru ekranu głównego:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
źródło
Możesz również potrzebować:
aby uzyskać łączny rozmiar wszystkich monitorów, a nie jednego w szczególności.
źródło
PresentationFramework.dll
iusing System.Windows;
Dodanie rozwiązania, które nie używa WinForms, ale zamiast tego NativeMethods. Najpierw musisz zdefiniować potrzebne metody natywne.
A następnie zdobądź uchwyt monitora i takie informacje o monitorze.
źródło
Dodaj do ffpf
źródło
Uważaj na współczynnik skalowania swoich okien (100% / 125% / 150% / 200%). Możesz uzyskać rzeczywisty rozmiar ekranu, używając następującego kodu:
źródło
Chciałem mieć rozdzielczość ekranu przed otwarciem pierwszego z moich okien, więc tutaj szybkie rozwiązanie, aby otworzyć niewidoczne okno przed faktycznym pomiarem wymiarów ekranu (musisz dostosować parametry okna do swojego okna, aby upewnić się, że oba są otwarte ten sam ekran - przede wszystkim
WindowStartupLocation
ważny)źródło
To jest " rozwiązanie DotNet 4.5 ekranu centralnego ", używające SystemParameters zamiast System.Windows.Forms lub My.Compuer.Screen : Ponieważ Windows 8 zmienił obliczanie wymiarów ekranu, jedyny sposób, w jaki to działa dla mnie wygląda tak (Obliczanie paska zadań w zestawie):
źródło
Musiałem ustawić maksymalny rozmiar mojej aplikacji okiennej. Ten można odpowiednio zmienić, aplikacja jest wyświetlana na głównym ekranie lub w drugim. Aby rozwiązać ten problem, stworzyliśmy prostą metodę, którą pokażę dalej:
źródło
w C # winforms mam punkt startowy (w przypadku gdy mamy kilka monitorów / diplay i jeden formularz wywołuje inny) za pomocą następującej metody:
źródło
WinForms
W przypadku konfiguracji z wieloma monitorami konieczne będzie również uwzględnienie pozycji X i Y:
źródło
Ten kod debugujący powinien dobrze załatwić sprawę:
Możesz zbadać właściwości klasy ekranu
Umieść wszystkie ekrany w tablicy lub liście za pomocą Screen.AllScreens, a następnie przechwyć indeks bieżącego ekranu i jego właściwości.
C # (przekonwertowany z VB przez Telerik - sprawdź dokładnie)
VB (oryginalny kod)
źródło