Mengubah jawaban yang diterima untuk mencerminkan cara terbaik untuk melakukan ini dari WPF. System.Windows.SystemParameters. *
chilltemp
1
Obsesi untuk tidak menggunakan namespace WinForms tampaknya aneh bagi saya, itu tidak memberi Anda apa-apa; sebaliknya, ia meninggalkan Anda tanpa alat yang Anda butuhkan untuk menyelesaikan masalah dengan benar.
Jeff Yates
4
Bagi saya, ini bukan tentang WinForms vs WPF. Ini tentang mempelajari sesuatu yang baru. Saya tidak bisa memutuskan jalan mana yang lebih baik jika saya tidak belajar keduanya.
chilltemp
3
Nah, dalam skenario ini tidak ada "dua arah" karena hanya ada satu cara untuk melakukan ini, yaitu menggunakan barang-barang WinForms.
Jeff Yates
@ Jeff Yates: Anda benar. Saya menggali proyek asli yang saya ajukan pertanyaan ini, dan menemukan bahwa saya menggunakan properti PrimaryScreen *. Mereka memecahkan kebutuhan saya hari itu, tetapi bukan pertanyaan sebenarnya yang saya tanyakan. Maaf atas kesalahannya; Saya telah mengubah jawaban yang diterima sesuai.
chilltemp
Jawaban:
143
Screen.FromControl, Screen.FromPointdan Screen.FromRectangleakan membantu Anda dengan ini. Sebagai contoh di WinForms adalah:
Mungkin penandaan saya tidak menjelaskan bahwa saya menggunakan windows WPF, bukan WinForms. Saya tidak memiliki referensi System.Windows.Forms.dll, dan itu tidak akan berhasil karena WPF memiliki pohon warisannya sendiri.
chilltemp
1
Sama-sama. Permintaan maaf saya karena tidak langsung menjawabnya - saya harus menyelidiki apa yang tersedia di WPF sebelum saya memperbarui posting saya.
Jeff Yates
Ini berfungsi untuk meletakkan jendela di tepi kanan: var bounds = this.GetScreen (). WorkingArea; this.Left = bounds.Right - this.Width; Tetapi membutuhkan referensi untuk System.Windows.Forms dan System.Drawing, yang tidak ideal.
Anthony
1
@devios Berhati-hatilah bahwa panggilan ini tidak menyadari DPI; Anda harus melakukan perhitungan.
Lynn Crumbling
6
Dalam saya VS 2015 WPF aplikasi menargetkan NET 4.5 pada sistem 4-monitor saya pada Windows 10 Pro (v10.0.14393) dengan windowmonitor di atas Primer saya (misalnya, yang Top < 0), FromHandlemengembalikan Screenmonitor Primer saya (meskipun windowitu benar-benar dalam monitor Sekunder)!?! Mendesah. Sepertinya saya harus mencari Screen.AllScreenssendiri Array. Mengapa hal-hal "tidak berfungsi"?!? Arrrrgh.
Tom
62
Anda dapat menggunakan ini untuk mendapatkan batas ruang kerja desktop dari layar utama:
Saya bingung ... Ini sepertinya hanya mengembalikan dimensi layar utama. Saya ingin tahu dimensi layar saat ini di jendela ...
VitalyB
1
ini tidak menjawab pertanyaan dan bahkan jika Anda hanya ingin mendapatkan ukuran tampilan utama, SystemParameters (dalam WPF) salah. mereka mengembalikan unit perangkat independen dan bukan piksel. untuk implementasi yang lebih baik lihat jawaban ini: stackoverflow.com/questions/254197/…
Patrick Klug
1
PrimaryScreenHeight / Width bekerja persis seperti yang diharapkan, dan MSDN memiliki yang berikut pada mereka: "Mendapat nilai yang menunjukkan ketinggian layar, dalam piksel, dari monitor tampilan utama." WorkArea tidak secara khusus mengatakan piksel, tetapi dokumentasi dan contoh penggunaan membuat saya percaya bahwa itu juga dalam piksel. Apakah Anda memiliki tautan ke sesuatu yang menunjukkan penggunaan unit independen perangkat?
Petunjuk: Untuk menggunakannya, orang perlu menambahkan referensi PresentationFramework.dlldanusing System.Windows;
Matt
17
Menambahkan solusi yang tidak menggunakan WinForms tetapi NativeMethods sebagai gantinya. Pertama, Anda perlu mendefinisikan metode asli yang dibutuhkan.
Itu untuk layar utama - bagaimana jika jendela aplikasi Anda berada di layar virtual (diperluas) (yaitu Anda memiliki satu atau dua monitor eksternal yang terpasang pada PC Anda)?
Mat
4
Saya ingin memiliki resolusi layar sebelum membuka jendela pertama saya, jadi di sini solusi cepat untuk membuka jendela tak terlihat sebelum benar-benar mengukur dimensi layar (Anda perlu menyesuaikan parameter jendela ke jendela Anda untuk memastikan bahwa keduanya terbuka pada layar yang sama - terutama yang WindowStartupLocationpenting)
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
Pertanyaan utamanya adalah tentang posisi layar. Seperti installer Msi, Innosetup atau yang lain, saya membuat installer saya sendiri dengan pemeriksaan CPU, pemeriksaan izin, verifikasi driver dan banyak lagi, sangat mudah digunakan. Thats screenshot tentang.
Nasenbaer
3
Saya perlu mengatur ukuran maksimum aplikasi jendela saya. Yang satu ini bisa berubah sesuai dengan aplikasi yang ditunjukkan di layar utama atau di layar sekunder. Untuk mengatasi masalah ini, kami membuat metode sederhana yang saya tunjukkan selanjutnya:
/// <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;}}}
di C # winforms saya sudah mendapatkan titik awal (untuk kasus ketika kita memiliki beberapa monitor / diplay dan satu formulir memanggil yang lain) dengan bantuan metode berikut:
Jawaban:
Screen.FromControl
,Screen.FromPoint
danScreen.FromRectangle
akan membantu Anda dengan ini. Sebagai contoh di WinForms adalah:Saya tidak tahu panggilan setara untuk WPF. Karena itu, Anda perlu melakukan sesuatu seperti metode ekstensi ini.
sumber
window
monitor di atas Primer saya (misalnya, yangTop < 0
),FromHandle
mengembalikanScreen
monitor Primer saya (meskipunwindow
itu benar-benar dalam monitor Sekunder)!?! Mendesah. Sepertinya saya harus mencariScreen.AllScreens
sendiri Array. Mengapa hal-hal "tidak berfungsi"?!? Arrrrgh.Anda dapat menggunakan ini untuk mendapatkan batas ruang kerja desktop dari layar utama:
System.Windows.SystemParameters.WorkArea
Ini juga berguna untuk mendapatkan ukuran layar utama:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
sumber
Anda juga mungkin perlu:
untuk mendapatkan ukuran gabungan dari semua monitor dan tidak satu pada khususnya.
sumber
PresentationFramework.dll
danusing System.Windows;
Menambahkan solusi yang tidak menggunakan WinForms tetapi NativeMethods sebagai gantinya. Pertama, Anda perlu mendefinisikan metode asli yang dibutuhkan.
Dan kemudian dapatkan pegangan monitor dan info monitor seperti ini.
sumber
Tambahkan ke ffpf
sumber
Waspadai faktor skala jendela Anda (100% / 125% / 150% / 200%). Anda bisa mendapatkan ukuran layar nyata dengan menggunakan kode berikut:
sumber
Saya ingin memiliki resolusi layar sebelum membuka jendela pertama saya, jadi di sini solusi cepat untuk membuka jendela tak terlihat sebelum benar-benar mengukur dimensi layar (Anda perlu menyesuaikan parameter jendela ke jendela Anda untuk memastikan bahwa keduanya terbuka pada layar yang sama - terutama yang
WindowStartupLocation
penting)sumber
Ini adalah " solusi Tengah Layar DotNet 4.5 ", menggunakan SystemParameters bukan System.Windows.Forms atau My.Compuer.Screen : Karena Windows 8 telah mengubah perhitungan dimensi layar, satu-satunya cara kerjanya bagi saya terlihat seperti itu (perhitungan Taskbar) termasuk):
sumber
Saya perlu mengatur ukuran maksimum aplikasi jendela saya. Yang satu ini bisa berubah sesuai dengan aplikasi yang ditunjukkan di layar utama atau di layar sekunder. Untuk mengatasi masalah ini, kami membuat metode sederhana yang saya tunjukkan selanjutnya:
sumber
di C # winforms saya sudah mendapatkan titik awal (untuk kasus ketika kita memiliki beberapa monitor / diplay dan satu formulir memanggil yang lain) dengan bantuan metode berikut:
sumber
WinForms
Untuk pengaturan multi-monitor, Anda juga memerlukan akun untuk posisi X dan Y:
sumber
Kode debug ini harus melakukan trik dengan baik:
Anda dapat menjelajahi properti dari Kelas Layar
Letakkan semua display dalam array atau daftar menggunakan Screen.AllScreens lalu ambil indeks tampilan saat ini dan propertinya.
C # (Dikonversi dari VB oleh Telerik - Silakan periksa kembali)
VB (kode asli)
sumber