मैं सक्रिय स्क्रीन आयाम कैसे प्राप्त कर सकता हूं?


142

मैं जिस चीज की तलाश कर रहा हूं, वह System.Windows.SystemParameters.WorkAreaउस मॉनीटर के बराबर है , जिस पर विंडो फिलहाल है।

स्पष्टता: प्रश्न में खिड़की है WPF, नहीं WinForm


2
WPF से इसे करने का सबसे अच्छा तरीका प्रतिबिंबित करने के लिए स्वीकृत उत्तर को बदल दिया। System.Windows.SystemParameters। *
chilltemp

1
WinForms नाम स्थान का उपयोग न करने का जुनून मुझे अजीब लगता है, इससे आपको कुछ हासिल नहीं होता है; इसके बजाय, यह आपको उन उपकरणों के बिना छोड़ देता है जिन्हें आपको समस्या को ठीक से हल करने की आवश्यकता है।
जेफ येट्स

4
मेरे लिए, यह WinForms बनाम WPF के बारे में नहीं है। यह कुछ नया सीखने के बारे में है। मैं तय नहीं कर सकता कि अगर मैं दोनों तरीके नहीं सीखता तो कौन सा रास्ता बेहतर है।
चिल्टपम्प

3
इस परिदृश्य में, कोई "दोनों तरीके" नहीं हैं क्योंकि ऐसा करने का केवल एक ही तरीका है, जो कि WinForms सामान का उपयोग करना है।
जेफ येट्स

@ जेफ़ येट्स: आप सही हैं। मैंने उस मूल परियोजना को खोदा, जो मैंने यह प्रश्न पूछा था, और पाया कि मैंने प्राइमरीस्क्रीन * गुणों का उपयोग किया है। उन्होंने दिन की मेरी जरूरतों को हल किया, लेकिन मेरे द्वारा पूछे गए वास्तविक प्रश्न को नहीं। भाग-दौड़ के लिए क्षमा करें; मैंने तदनुसार स्वीकृत उत्तर को बदल दिया है।
चिल्टपम्प

जवाबों:


143

Screen.FromControl, Screen.FromPointऔर इसमें Screen.FromRectangleआपकी मदद करनी चाहिए। WinForms में उदाहरण के लिए यह होगा:

class MyForm : Form
{
  public Rectangle GetScreen()
  {
    return Screen.FromControl(this).Bounds;
  }
}

मुझे WPF के लिए एक समकक्ष कॉल की जानकारी नहीं है। इसलिए, आपको इस एक्सटेंशन विधि की तरह कुछ करने की आवश्यकता है।

static class ExtensionsForWPF
{
  public static System.Windows.Forms.Screen GetScreen(this Window window)
  {
    return System.Windows.Forms.Screen.FromHandle(new WindowInteropHelper(window).Handle);
  }
}

1
शायद मेरी टैगिंग ने यह स्पष्ट नहीं किया कि मैं WPF विंडो का उपयोग कर रहा हूं, WinForms का नहीं। मेरे पास System.Windows.Forms.dll संदर्भित नहीं है, और यह वैसे भी काम नहीं करेगा क्योंकि WPF का अपना वंशानुक्रम वृक्ष है।
चिल्टपम्प

1
आपका स्वागत है। उत्तर के लिए सीधे नहीं मिलने के लिए मेरी माफी - मुझे अपनी पोस्ट अपडेट करने से पहले WPF में क्या उपलब्ध था, इसकी जांच करनी थी।
जेफ येट्स

यह दाहिने हाथ के किनारे पर एक खिड़की लगाने के लिए काम करता है: var सीमा = this.GetScreen ()। यह.लिफ्ट = सीमा। यह - यह। लेकिन इसके लिए System.Windows.Forms और System.Drawing के संदर्भ की आवश्यकता होती है, जो आदर्श नहीं है।
एंथनी

1
@devios खबरदार कि यह कॉल DPI- जागरूक नहीं है; आपको गणना करने की आवश्यकता होगी।
लिन क्रंबलिंग

6
मेरी वी.एस. 2015 WPF Windows 10 प्रो (v10.0.14393) के साथ पर मेरी 4-मॉनिटर सिस्टम पर .NET 4.5 को लक्षित ऐप्लिकेशन में windowमॉनीटर पर ऊपर मेरी प्राथमिक के (जैसे, इसकी Top < 0), FromHandleलौटे Screenलिए मेरी प्राथमिक मॉनिटर की (भले ही windowथा पूरी तरह से भीतर माध्यमिक मॉनिटर)! आह। ऐसा लगता है कि मुझे Screen.AllScreensखुद ऐरे को खोजना होगा । चीजें "सिर्फ काम" क्यों नहीं कर सकती?!? Arrrrgh।
टॉम

62

आप इसका उपयोग प्राथमिक स्क्रीन के डेस्कटॉप कार्यक्षेत्र सीमाएँ प्राप्त करने के लिए कर सकते हैं:

System.Windows.SystemParameters.WorkArea

यह प्राथमिक स्क्रीन के आकार को प्राप्त करने के लिए भी उपयोगी है:

System.Windows.SystemParameters.PrimaryScreenWidth System.Windows.SystemParameters.PrimaryScreenHeight


19
मैं उलझन में हूँ ... यह केवल प्राथमिक स्क्रीन आयाम वापस करने के लिए लगता है। मैं स्क्रीन के आयामों को जानना चाहता हूं कि खिड़की वर्तमान में है ...
विटाली बी

1
यह सवाल का जवाब नहीं देता है और यहां तक ​​कि अगर आप प्राथमिक प्रदर्शन का आकार प्राप्त करना चाहते हैं, तो SystemParameters (WPF में) गलत है। वे डिवाइस को स्वतंत्र इकाइयाँ लौटाते हैं और पिक्सेल नहीं । एक बेहतर क्रियान्वयन के लिए इस उत्तर को देखें: stackoverflow.com/questions/254197/…
पैट्रिक क्लुग

1
PrimaryScreenHeight / Width ने अपेक्षा के अनुरूप काम किया, और MSDN ने उन पर निम्न कार्य किया: "एक मान हो जाता है जो प्राथमिक प्रदर्शन मॉनीटर के पिक्सेल में, स्क्रीन की ऊँचाई को इंगित करता है।" वर्कअरा विशेष रूप से पिक्सेल नहीं कहता है, लेकिन प्रलेखन और उपयोग के उदाहरण मुझे विश्वास दिलाते हैं कि यह पिक्सेल में भी है। क्या आपके पास डिवाइस स्वतंत्र इकाइयों के उपयोग को इंगित करने वाली किसी चीज़ का लिंक है?
१ill:

34

इसके अलावा आपको आवश्यकता हो सकती है:

सभी मॉनिटरों के संयुक्त आकार को प्राप्त करने के लिए और विशेष रूप से एक नहीं।


1
संकेत: इसका उपयोग करने के लिए, किसी को संदर्भ जोड़ने की जरूरत है PresentationFramework.dllऔरusing System.Windows;
मैट

17

एक समाधान जोड़ना जो WinForms का उपयोग करता है, लेकिन इसके बजाय NativeMethods। सबसे पहले आपको आवश्यक देशी तरीकों को परिभाषित करने की आवश्यकता है।

public static class NativeMethods
{
    public const Int32 MONITOR_DEFAULTTOPRIMERTY = 0x00000001;
    public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;


    [DllImport( "user32.dll" )]
    public static extern IntPtr MonitorFromWindow( IntPtr handle, Int32 flags );


    [DllImport( "user32.dll" )]
    public static extern Boolean GetMonitorInfo( IntPtr hMonitor, NativeMonitorInfo lpmi );


    [Serializable, StructLayout( LayoutKind.Sequential )]
    public struct NativeRectangle
    {
        public Int32 Left;
        public Int32 Top;
        public Int32 Right;
        public Int32 Bottom;


        public NativeRectangle( Int32 left, Int32 top, Int32 right, Int32 bottom )
        {
            this.Left = left;
            this.Top = top;
            this.Right = right;
            this.Bottom = bottom;
        }
    }


    [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )]
    public sealed class NativeMonitorInfo
    {
        public Int32 Size = Marshal.SizeOf( typeof( NativeMonitorInfo ) );
        public NativeRectangle Monitor;
        public NativeRectangle Work;
        public Int32 Flags;
    }
}

और फिर मॉनिटर हैंडल और मॉनिटर की जानकारी इस तरह प्राप्त करें।

        var hwnd = new WindowInteropHelper( this ).EnsureHandle();
        var monitor = NativeMethods.MonitorFromWindow( hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST );

        if ( monitor != IntPtr.Zero )
        {
            var monitorInfo = new NativeMonitorInfo();
            NativeMethods.GetMonitorInfo( monitor, monitorInfo );

            var left = monitorInfo.Monitor.Left;
            var top = monitorInfo.Monitor.Top;
            var width = ( monitorInfo.Monitor.Right - monitorInfo.Monitor.Left );
            var height = ( monitorInfo.Monitor.Bottom - monitorInfo.Monitor.Top );
        }

1
अगर आपकी खिड़कियों के स्केल फैक्टर (100% / 125% / 150% / 200%) हैं तो क्या आप वास्तविक स्क्रीन का आकार प्राप्त कर सकते हैं?
किनिकेत


12

अपनी खिड़कियों के स्केल फैक्टर से सावधान रहें (100% / 125% / 150% / 200%)। आप निम्न कोड का उपयोग करके वास्तविक स्क्रीन आकार प्राप्त कर सकते हैं:

SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth

1
यह प्राथमिक स्क्रीन के लिए है - क्या होगा यदि आपकी ऐप विंडो वर्चुअल (विस्तारित) स्क्रीन पर है (यानी आपके पास आपके पीसी पर एक या दो बाहरी मॉनिटर हैं)?
मैट

4

मैं अपनी पहली विंडो खोलने से पहले स्क्रीन रिज़ॉल्यूशन रखना चाहता था, इसलिए यहाँ वास्तव में स्क्रीन आयामों को मापने से पहले एक अदृश्य विंडो खोलने का एक त्वरित समाधान है (आपको यह सुनिश्चित करने के लिए खिड़की के मापदंडों को अपनी विंडो में अनुकूलित करने की आवश्यकता है ताकि दोनों खुले हैं। एक ही स्क्रीन - मुख्य रूप WindowStartupLocationसे महत्वपूर्ण है)

Window w = new Window();
w.ResizeMode = ResizeMode.NoResize;
w.WindowState = WindowState.Normal;
w.WindowStyle = WindowStyle.None;
w.Background = Brushes.Transparent;
w.Width = 0;
w.Height = 0;
w.AllowsTransparency = true;
w.IsHitTestVisible = false;
w.WindowStartupLocation = WindowStartupLocation.Manual;
w.Show();
Screen scr = Screen.FromHandle(new WindowInteropHelper(w).Handle);
w.Close();

3

यह एक "सेंटर स्क्रीन डॉटनेट 4.5 सॉल्यूशन " है, जिसका इस्तेमाल System.Windows.Forms या My.Compuer.Screen के बजाय SystemParameters का उपयोग करके किया जा रहा है : चूंकि Windows 8 ने स्क्रीन डायमेंशन गणना को बदल दिया है, मेरे लिए यह काम करने का एकमात्र तरीका ऐसा दिखता है (टास्कबार गणना) शामिल है):

Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Dim BarWidth As Double = SystemParameters.VirtualScreenWidth - SystemParameters.WorkArea.Width
    Dim BarHeight As Double = SystemParameters.VirtualScreenHeight - SystemParameters.WorkArea.Height
    Me.Left = (SystemParameters.VirtualScreenWidth - Me.ActualWidth - BarWidth) / 2
    Me.Top = (SystemParameters.VirtualScreenHeight - Me.ActualHeight - BarHeight) / 2         
End Sub

केंद्र स्क्रीन WPF XAML


WPF में इंस्टॉलर सेटअप?
किकेनेट

मुख्य प्रश्न स्क्रीन की स्थिति के बारे में है। जैसे Msi इंस्टॉलर, Innosetup या अन्य, मैंने CPU-चेक, अनुमति जांच, ड्राइवर सत्यापन और बहुत अधिक, उपयोग करने के लिए बहुत सरल के साथ अपना स्वयं का इंस्टॉलर बनाया। स्क्रीनशॉट के बारे में।
Nasenbaer

3

मुझे अपने विंडो एप्लिकेशन का अधिकतम आकार सेट करने की आवश्यकता थी। यह एक तदनुसार बदला जा सकता है कि आवेदन को प्राथमिक स्क्रीन में या माध्यमिक में दिखाया गया है। इस समस्या को दूर करने के लिए e ने एक सरल विधि बनाई जो मैं आपको दिखाता हूं:

/// <summary>
/// Set the max size of the application window taking into account the current monitor
/// </summary>
public static void SetMaxSizeWindow(ioConnect _receiver)
{
    Point absoluteScreenPos = _receiver.PointToScreen(Mouse.GetPosition(_receiver));

    if (System.Windows.SystemParameters.VirtualScreenLeft == System.Windows.SystemParameters.WorkArea.Left)
    {
        //Primary Monitor is on the Left
        if (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 Right
        if (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;
        }
    }
}

1

C # winforms में मुझे शुरुआती बिंदु मिला है (मामले के लिए जब हमारे पास कई मॉनिटर / डिप्लोमा हैं और एक फॉर्म दूसरे को कॉल कर रहा है) निम्न विधि की मदद से:

private Point get_start_point()
    {
        return
            new Point(Screen.GetBounds(parent_class_with_form.ActiveForm).X,
                      Screen.GetBounds(parent_class_with_form.ActiveForm).Y
                      );
    }

1

WinForms

मल्टी-मॉनिटर सेटअप के लिए आपको X और Y स्थिति के लिए भी खाते की आवश्यकता होगी:

Rectangle activeScreenDimensions = Screen.FromControl(this).Bounds;
this.Size = new Size(activeScreenDimensions.Width + activeScreenDimensions.X, activeScreenDimensions.Height + activeScreenDimensions.Y);

0

यह डिबगिंग कोड अच्छी तरह से चाल करना चाहिए:

आप स्क्रीन क्लास के गुणों का पता लगा सकते हैं

Screen.AllScreens का उपयोग करके किसी डिस्प्ले या सूची में सभी डिस्प्ले रखें और फिर वर्तमान डिस्प्ले और उसके गुणों के सूचकांक को कैप्चर करें।

यहां छवि विवरण दर्ज करें

C # (VB से तेलेरिक द्वारा परिवर्तित - कृपया दोहरी जांच)

        {
    List<Screen> arrAvailableDisplays = new List<Screen>();
    List<string> arrDisplayNames = new List<string>();

    foreach (Screen Display in Screen.AllScreens)
    {
        arrAvailableDisplays.Add(Display);
        arrDisplayNames.Add(Display.DeviceName);
    }

    Screen scrCurrentDisplayInfo = Screen.FromControl(this);
    string strDeviceName = Screen.FromControl(this).DeviceName;
    int idxDevice = arrDisplayNames.IndexOf(strDeviceName);

    MessageBox.Show(this, "Number of Displays Found: " + arrAvailableDisplays.Count.ToString() + Constants.vbCrLf + "ID: " + idxDevice.ToString() + Constants.vbCrLf + "Device Name: " + scrCurrentDisplayInfo.DeviceName.ToString + Constants.vbCrLf + "Primary: " + scrCurrentDisplayInfo.Primary.ToString + Constants.vbCrLf + "Bounds: " + scrCurrentDisplayInfo.Bounds.ToString + Constants.vbCrLf + "Working Area: " + scrCurrentDisplayInfo.WorkingArea.ToString + Constants.vbCrLf + "Bits per Pixel: " + scrCurrentDisplayInfo.BitsPerPixel.ToString + Constants.vbCrLf + "Width: " + scrCurrentDisplayInfo.Bounds.Width.ToString + Constants.vbCrLf + "Height: " + scrCurrentDisplayInfo.Bounds.Height.ToString + Constants.vbCrLf + "Work Area Width: " + scrCurrentDisplayInfo.WorkingArea.Width.ToString + Constants.vbCrLf + "Work Area Height: " + scrCurrentDisplayInfo.WorkingArea.Height.ToString, "Current Info for Display '" + scrCurrentDisplayInfo.DeviceName.ToString + "' - ID: " + idxDevice.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information);
}

VB (मूल कोड)

 Dim arrAvailableDisplays As New List(Of Screen)()
    Dim arrDisplayNames As New List(Of String)()

    For Each Display As Screen In Screen.AllScreens
        arrAvailableDisplays.Add(Display)
        arrDisplayNames.Add(Display.DeviceName)
    Next

    Dim scrCurrentDisplayInfo As Screen = Screen.FromControl(Me)
    Dim strDeviceName As String = Screen.FromControl(Me).DeviceName
    Dim idxDevice As Integer = arrDisplayNames.IndexOf(strDeviceName)

    MessageBox.Show(Me,
                    "Number of Displays Found: " + arrAvailableDisplays.Count.ToString & vbCrLf &
                    "ID: " & idxDevice.ToString + vbCrLf &
                    "Device Name: " & scrCurrentDisplayInfo.DeviceName.ToString + vbCrLf &
                    "Primary: " & scrCurrentDisplayInfo.Primary.ToString + vbCrLf &
                    "Bounds: " & scrCurrentDisplayInfo.Bounds.ToString + vbCrLf &
                    "Working Area: " & scrCurrentDisplayInfo.WorkingArea.ToString + vbCrLf &
                    "Bits per Pixel: " & scrCurrentDisplayInfo.BitsPerPixel.ToString + vbCrLf &
                    "Width: " & scrCurrentDisplayInfo.Bounds.Width.ToString + vbCrLf &
                    "Height: " & scrCurrentDisplayInfo.Bounds.Height.ToString + vbCrLf &
                    "Work Area Width: " & scrCurrentDisplayInfo.WorkingArea.Width.ToString + vbCrLf &
                    "Work Area Height: " & scrCurrentDisplayInfo.WorkingArea.Height.ToString,
                    "Current Info for Display '" & scrCurrentDisplayInfo.DeviceName.ToString & "' - ID: " & idxDevice.ToString, MessageBoxButtons.OK, MessageBoxIcon.Information)

स्क्रीन सूची

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.