কীভাবে আমি সক্রিয় পর্দার মাত্রা পেতে পারি?


142

আমি যা খুঁজছি System.Windows.SystemParameters.WorkAreaতা মনিটরের সমতুল্য যা উইন্ডোটি বর্তমানে চালু রয়েছে।

স্পষ্টতা: প্রশ্নে উইন্ডো WPF, না WinForm


2
ডাব্লুপিএফ থেকে এটি করার সর্বোত্তম উপায় প্রতিফলিত হওয়ার জন্য গ্রহণযোগ্য উত্তর পরিবর্তিত হয়েছে। System.Windows.SisstParaters। *
চিলটেম্প

1
উইনফোর্ডস নেমস্পেস ব্যবহার না করার আবেগটি আমার কাছে অদ্ভুত বলে মনে হয়, এটি আপনার কোনও লাভই করে না; পরিবর্তে, সমস্যাটি সঠিকভাবে সমাধানের জন্য আপনার প্রয়োজনীয় সরঞ্জামগুলি ছাড়াই এটি আপনাকে ছেড়ে দেয়।
জেফ ইয়েটস

4
আমার জন্য, এটি উইনফোর্ডস বনাম ডাব্লুপিএফ সম্পর্কে নয়। এটি নতুন কিছু শেখার বিষয়ে। আমি উভয় পদ্ধতি না শিখলে কোন উপায়টি ভাল তা আমি সিদ্ধান্ত নিতে পারি না।
চিলটেম্প

3
ঠিক আছে, এই দৃশ্যে কোনও "উভয় উপায়" নেই কারণ এটি করার একমাত্র উপায়, যা উইনফোর্ডস স্টাফ ব্যবহার করা।
জেফ ইয়েটস

@ জেফ ইয়েটস: আপনি সঠিক বলেছেন। আমি যে মূল প্রকল্পটির জন্য এই প্রশ্নটি জিজ্ঞাসা করেছি আমি তা খনন করে দেখেছি যে আমি প্রাথমিকস্ক্রিন * বৈশিষ্ট্য ব্যবহার করেছি used তারা আমার সময়ের প্রয়োজনগুলি সমাধান করেছে, তবে আমি যে সত্যিকারের প্রশ্নটি জিজ্ঞাসা করেছি তা নয়। দৌড়ের জন্য দুঃখিত; আমি সেই অনুযায়ী গৃহীত উত্তর পরিবর্তন করেছি changed
চিলটেম্প

উত্তর:


143

Screen.FromControl, Screen.FromPointএবং Screen.FromRectangleএটি আপনাকে সাহায্য করা উচিত। উদাহরণস্বরূপ উইনফর্মগুলিতে এটি হ'ল:

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

আমি ডাব্লুপিএফ-এর সমতুল কল সম্পর্কে জানি না। অতএব, আপনাকে এই এক্সটেনশন পদ্ধতির মতো কিছু করতে হবে।

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

1
সম্ভবত আমার ট্যাগিংটি এটি পরিষ্কার করে নি যে আমি উইনফর্মগুলি নয়, ডাব্লুপিএফ উইন্ডোজ ব্যবহার করছি। আমার কাছে System.Windows. Forms.dll রেফারেন্স নেই, এবং ডব্লুপিএফের নিজস্ব উত্তরাধিকার গাছ থাকার কারণে এটি কোনওভাবেই কাজ করবে না।
চিলডেম্প

1
আপনাকে স্বাগতম. সরাসরি উত্তর না পাওয়ার জন্য আমার ক্ষমা - আমার পোস্ট আপডেট করার আগে আমাকে ডাব্লুপিএফ-এ কী পাওয়া যায় তা খতিয়ে দেখতে হয়েছিল।
জেফ ইয়েটস

এটি ডান হাতের প্রান্তে একটি উইন্ডো রাখার জন্য কাজ করে: var গণ্ডি = এটি.গেটস্ক্রিন ()। ওয়ার্কিংআরিয়া; this.Left = bounds.Right - this.Width; তবে এটিতে System.Windows. Forms এবং System.Drawing- এর রেফারেন্স প্রয়োজন, যা আদর্শ নয়।
অ্যান্টনি

1
@ ডিভিওস সাবধান যে এই কলটি ডিপিআই-সচেতন নয়; আপনার গণনা করা দরকার।
লিন ক্র্যাম্বলিং

6
আমার বনাম 2015 WPF উইন্ডোজ 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
এটি প্রশ্নের উত্তর দেয় না এবং এমনকি যদি আপনি প্রাথমিক প্রদর্শনটির আকার পেতে চান তবে সিস্টেমপ্যারামিটারগুলি (ডাব্লুপিএফ) ভুল রয়েছে। তারা পিক্সেল নয় ডিভাইস স্বাধীন ইউনিট ফিরে । আরও ভাল বাস্তবায়নের জন্য এই উত্তরটি দেখুন: stackoverflow.com/questions/254197/…
প্যাট্রিক ক্লুগ

1
প্রাইমারিস্ক্রিনহাইট / প্রস্থ প্রত্যাশা মতো ঠিক কাজ করেছে এবং এমএসডিএন তাদের উপর নিম্নলিখিতটি রয়েছে: "প্রাথমিক মান মনিটরের পিক্সেলগুলিতে পর্দার উচ্চতা নির্দেশ করে এমন একটি মান পাওয়া যায়।" ওয়ার্কআরিয়া সুনির্দিষ্টভাবে পিক্সেল বলে না, তবে ডকুমেন্টেশন এবং ব্যবহারের উদাহরণগুলি আমাকে বিশ্বাস করতে পরিচালিত করে যে এটি পিক্সেলের মধ্যেও রয়েছে। ডিভাইস স্বতন্ত্র ইউনিট ব্যবহারের ইঙ্গিত দেয় এমন কোনও কিছুর সাথে আপনার কি লিঙ্ক আছে?
চিলটেম্প

34

এছাড়াও আপনার প্রয়োজন হতে পারে:

সমস্ত মনিটরের সম্মিলিত আকার পেতে এবং বিশেষত এক নয়।


1
ইঙ্গিত: এটি ব্যবহার করার জন্য, একটিতে রেফারেন্স যুক্ত করতে হবে PresentationFramework.dllএবংusing System.Windows;
ম্যাট

17

একটি সমাধান যুক্ত করা হচ্ছে যা উইনফোর্ডগুলি ব্যবহার করে না তবে এর পরিবর্তে নেটিমেটমেডগুলি ব্যবহার করে। প্রথমে আপনাকে প্রয়োজনীয় নেটিভ পদ্ধতিগুলি নির্ধারণ করতে হবে।

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

এই "সেন্টার পর্দায় রয়েছে DotNet 4.5 সমাধান ," ব্যবহার SystemParameters পরিবর্তে System.Windows.Forms বা My.Compuer.Screen : যেহেতু উইন্ডোজ 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 এ ইনস্টলার সেটআপ?
কিকিনেট

মূল প্রশ্নটি পর্দার অবস্থান সম্পর্কে। এমএসআই ইনস্টলার, ইনোসেটআপ বা অন্যদের মতো, আমি সিপিইউ-চেক, অনুমতি চেক, ড্রাইভার যাচাইকরণ এবং আরও অনেক কিছুর সাহায্যে নিজের ইনস্টলারটি তৈরি করেছি use স্ক্রিনশট সম্পর্কে।
নাসেনবায়ের

3

আমার উইন্ডো অ্যাপ্লিকেশনটির সর্বাধিক আকার নির্ধারণ করা দরকার। প্রাথমিক স্ক্রিনে বা মাধ্যমিকটিতে অ্যাপ্লিকেশনটি প্রদর্শিত হচ্ছে সেই অনুযায়ী এটির পরিবর্তিত হতে পারে। এই সমস্যাটি কাটিয়ে উঠতে এবং একটি সহজ পদ্ধতি তৈরি করেছি যা আমি আপনাকে পরবর্তী দেখাব:

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

সি # উইনফর্মগুলিতে আমি নীচের পদ্ধতির সাহায্যে স্টার্ট পয়েন্ট পেয়েছি (যদি আমাদের বেশ কয়েকটি মনিটর / ডিপ্লে থাকে এবং একটি ফর্ম অন্যটিকে কল দিচ্ছে):

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

মাল্টি-মনিটর সেটআপগুলির জন্য আপনার এক্স এবং ওয়াই অবস্থানের জন্য অ্যাকাউন্টেরও প্রয়োজন হবে:

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

0

এই ডিবাগিং কোডটি কৌশলটি ভালভাবে করা উচিত:

আপনি স্ক্রিন ক্লাসের বৈশিষ্ট্যগুলি ঘুরে দেখতে পারেন

স্ক্রিন ব্যবহার করে একটি অ্যারে বা তালিকায় সমস্ত প্রদর্শন রাখুন ll সমস্ত স্ক্রীন তারপরে বর্তমান প্রদর্শন এবং এর বৈশিষ্ট্যগুলির সূচক ক্যাপচার করে।

এখানে চিত্র বর্ণনা লিখুন

সি # (টেলিবি দ্বারা ভিবি থেকে রূপান্তরিত - দয়া করে ডাবল চেক করুন)

        {
    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);
}

ভিবি (মূল কোড)

 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)

স্ক্রীন তালিকা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.