जो मैं देख रहा हूं वह है कि मॉनिटर के लिए System.Windows.SystemParameters.WorkArea
के बराबर है कि विंडो चालू है।मैं सक्रिय स्क्रीन आयाम कैसे प्राप्त कर सकता हूं?
स्पष्टीकरण: प्रश्न में खिड़की WPF
, नहीं WinForm
है।
जो मैं देख रहा हूं वह है कि मॉनिटर के लिए System.Windows.SystemParameters.WorkArea
के बराबर है कि विंडो चालू है।मैं सक्रिय स्क्रीन आयाम कैसे प्राप्त कर सकता हूं?
स्पष्टीकरण: प्रश्न में खिड़की WPF
, नहीं WinForm
है।
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);
}
}
शायद मेरी टैगिंग ने यह स्पष्ट नहीं किया है कि मैं WPF विंडो का उपयोग कर रहा हूं, WinForms नहीं। मेरे पास System.Windows.Forms.dll का संदर्भ नहीं है, और यह वैसे भी काम नहीं करेगा क्योंकि डब्ल्यूपीएफ का अपना विरासत पेड़ है। – chilltemp
स्क्रीन। फ्रॉमहैंडल ... मुझे जो चाहिए वह वास्तव में किया। धन्यवाद – chilltemp
आपका स्वागत है। जवाब देने के लिए मेरी माफ़ी - मुझे अपनी पोस्ट अपडेट करने से पहले WPF में उपलब्ध क्या था, इसकी जांच करनी थी। । –
ffpf करने पर जोड़े
Screen.FromControl(this).Bounds
धन्यवाद, मैंने इसे अपने उदाहरण में जोड़ा। –
आप इस का उपयोग कर सकते हैं प्राथमिक स्क्रीन के डेस्कटॉप कार्यक्षेत्र सीमा प्राप्त करने के लिए:
System.Windows.SystemParameters.WorkArea
यह भी सिर्फ आकार प्राप्त करने के लिए उपयोगी है प्राथमिक स्क्रीन का:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
मैं उलझन में हूं ... ऐसा लगता है कि केवल प्राथमिक स्क्रीन आयामों को वापस करने के लिए। मैं स्क्रीन के आयामों को जानना चाहता हूं कि खिड़की वर्तमान में है ... – VitalyB
मैं उलझन में हूं कि यह सवाल पूछे जाने वाले प्रश्नों का उत्तर कैसे देता है। इस –
सवाल का जवाब नहीं है और यहां तक कि अगर आप सिर्फ प्राथमिक प्रदर्शन का आकार प्राप्त करना चाहते हैं SystemParameters (WPF में) गलत है। वे डिवाइस स्वतंत्र इकाइयों और * नहीं * पिक्सेल लौटते हैं। एक बेहतर कार्यान्वयन के लिए यह उत्तर देखें: http://stackoverflow.com/questions/254197/how-can-i-get-the-active-screen-dimensions/254241#254241 –
इसके अलावा, आप की आवश्यकता हो सकती:
सब पर नज़र रखता है के संयुक्त आकार और विशेष रूप से नहीं प्राप्त करने के लिए।
मैं अपनी खिड़कियों के पहले खोलने से पहले स्क्रीन रिज़ॉल्यूशन रखना चाहता था, इसलिए वास्तव में स्क्रीन आयामों को मापने से पहले एक अदृश्य विंडो खोलने का एक त्वरित समाधान (आपको विंडो विंडो पैरामीटर को अपनी विंडो में अनुकूलित करने की आवश्यकता है ताकि यह सुनिश्चित किया जा सके कि दोनों एक ही स्क्रीन पर 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();
मैं अपनी खिड़की आवेदन का अधिकतम आकार निर्धारित करने की जरूरत है। तदनुसार यह बदला जा सकता है कि आवेदन प्राथमिक स्क्रीन में या माध्यमिक में दिखाया गया है। इस समस्या को ई एक सरल विधि बनाया है कि मैं आप बगल में दिखाई दे काबू पाने के लिए:
/// <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;
}
}
}
क्या होगा यदि आपका प्राथमिक मॉनीटर चालू है सही? –
यह एक "केंद्र स्क्रीन 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
अनुसूचित जाति से सावधान रहें आपकी खिड़कियों का एले कारक (100%/125%/150%/200%)। आप नीचे दिए गए कोड का उपयोग करके वास्तविक स्क्रीन आकार प्राप्त कर सकते हैं:
SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth
एक समाधान है कि 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);
}
सी # 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
);
}
स्वीकार किए जाते हैं जवाब देने के लिए बदली गई WPF से ऐसा करने का सबसे अच्छा तरीका दर्शाता है। । System.Windows.SystemParameters * – chilltemp
एक WinForms नाम स्थान का उपयोग नहीं के साथ जुनून मेरे लिए अजीब लगता है, यह आप कुछ भी हासिल नहीं होता है; इसके बजाए, यह आपको उन समस्याओं के बिना छोड़ देता है जिन्हें आपको समस्या को हल करने के लिए आवश्यक है। –
मेरे लिए, यह WinForms बनाम WPF के बारे में नहीं है। यह कुछ नया सीखने के बारे में है। अगर मैं दोनों तरीकों से नहीं सीखता तो मैं तय नहीं कर सकता कि कौन सा तरीका बेहतर है। – chilltemp