2008-10-31 17 views
109

जो मैं देख रहा हूं वह है कि मॉनिटर के लिए System.Windows.SystemParameters.WorkArea के बराबर है कि विंडो चालू है।मैं सक्रिय स्क्रीन आयाम कैसे प्राप्त कर सकता हूं?

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

+1

स्वीकार किए जाते हैं जवाब देने के लिए बदली गई WPF से ऐसा करने का सबसे अच्छा तरीका दर्शाता है। । System.Windows.SystemParameters * – chilltemp

+0

एक WinForms नाम स्थान का उपयोग नहीं के साथ जुनून मेरे लिए अजीब लगता है, यह आप कुछ भी हासिल नहीं होता है; इसके बजाए, यह आपको उन समस्याओं के बिना छोड़ देता है जिन्हें आपको समस्या को हल करने के लिए आवश्यक है। –

+4

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

उत्तर

110

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 का संदर्भ नहीं है, और यह वैसे भी काम नहीं करेगा क्योंकि डब्ल्यूपीएफ का अपना विरासत पेड़ है। – chilltemp

+2

स्क्रीन। फ्रॉमहैंडल ... मुझे जो चाहिए वह वास्तव में किया। धन्यवाद – chilltemp

+1

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

10

ffpf करने पर जोड़े

Screen.FromControl(this).Bounds 
+0

धन्यवाद, मैंने इसे अपने उदाहरण में जोड़ा। –

58

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

System.Windows.SystemParameters.WorkArea

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

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

+13

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

+6

मैं उलझन में हूं कि यह सवाल पूछे जाने वाले प्रश्नों का उत्तर कैसे देता है। इस –

+1

सवाल का जवाब नहीं है और यहां तक ​​कि अगर आप सिर्फ प्राथमिक प्रदर्शन का आकार प्राप्त करना चाहते हैं SystemParameters (WPF में) गलत है। वे डिवाइस स्वतंत्र इकाइयों और * नहीं * पिक्सेल लौटते हैं। एक बेहतर कार्यान्वयन के लिए यह उत्तर देखें: http://stackoverflow.com/questions/254197/how-can-i-get-the-active-screen-dimensions/254241#254241 –

3

मैं अपनी खिड़कियों के पहले खोलने से पहले स्क्रीन रिज़ॉल्यूशन रखना चाहता था, इसलिए वास्तव में स्क्रीन आयामों को मापने से पहले एक अदृश्य विंडो खोलने का एक त्वरित समाधान (आपको विंडो विंडो पैरामीटर को अपनी विंडो में अनुकूलित करने की आवश्यकता है ताकि यह सुनिश्चित किया जा सके कि दोनों एक ही स्क्रीन पर openend कर रहे हैं - मुख्य रूप से 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(); 
2

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

/// <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

क्या होगा यदि आपका प्राथमिक मॉनीटर चालू है सही? –

1

यह एक "केंद्र स्क्रीन DotNet 4.5 solution" है, SystemParameters बजाय System.Windows.Forms या My.Compuer.Screen का उपयोग कर: स्क्रीन आयाम गणना Windows 8 has changed के बाद से, एक ही रास्ता यह काम करता है इस तरह (टास्कबार गणना शामिल है) के लिए मुझे लग रहा है:

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 

Center Screen WPF XAML

8

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

SystemParameters.FullPrimaryScreenHeight 
SystemParameters.FullPrimaryScreenWidth 
9

एक समाधान है कि 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

सी # WinForms में मैं प्रारंभ बिंदु मिल गया है (मामले के लिए जब हम कई मॉनिटर/diplay है और एक रूप एक दूसरे से फोन कर रहा है) निम्न विधि की मदद से:

private Point get_start_point() 
    { 
     return 
      new Point(Screen.GetBounds(parent_class_with_form.ActiveForm).X, 
         Screen.GetBounds(parent_class_with_form.ActiveForm).Y 
        ); 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे