আমি যা খুঁজছি System.Windows.SystemParameters.WorkArea
তা মনিটরের সমতুল্য যা উইন্ডোটি বর্তমানে চালু রয়েছে।
স্পষ্টতা: প্রশ্নে উইন্ডো WPF
, না WinForm
।
আমি যা খুঁজছি System.Windows.SystemParameters.WorkArea
তা মনিটরের সমতুল্য যা উইন্ডোটি বর্তমানে চালু রয়েছে।
স্পষ্টতা: প্রশ্নে উইন্ডো WPF
, না WinForm
।
উত্তর:
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);
}
}
window
মনিটরে উপরে আমার প্রাথমিক এর (যেমন, তার Top < 0
), FromHandle
ফিরে Screen
আমার প্রাথমিক মনিটর এর (যদিও window
ছিল সম্পূর্ণরূপে মধ্যে সেকেন্ডারি মনিটর)!?! দীর্ঘশ্বাস. দেখে মনে হচ্ছে আমাকে Screen.AllScreens
নিজেই অ্যারেটি অনুসন্ধান করতে হবে । জিনিস "শুধু কাজ" করতে পারে না কেন ?!? Arrrrgh।
আপনি প্রাথমিক স্ক্রিনের ডেস্কটপ ওয়ার্কস্পেসের সীমা পেতে এটি ব্যবহার করতে পারেন:
System.Windows.SystemParameters.WorkArea
এটি প্রাথমিক স্ক্রিনের মাত্র আকার পাওয়ার জন্য দরকারী:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
এছাড়াও আপনার প্রয়োজন হতে পারে:
সমস্ত মনিটরের সম্মিলিত আকার পেতে এবং বিশেষত এক নয়।
PresentationFramework.dll
এবংusing System.Windows;
একটি সমাধান যুক্ত করা হচ্ছে যা উইনফোর্ডগুলি ব্যবহার করে না তবে এর পরিবর্তে নেটিমেটমেডগুলি ব্যবহার করে। প্রথমে আপনাকে প্রয়োজনীয় নেটিভ পদ্ধতিগুলি নির্ধারণ করতে হবে।
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 );
}
এফএফপিএফ যোগ করুন
Screen.FromControl(this).Bounds
আপনার উইন্ডোগুলির স্কেল ফ্যাক্টর সম্পর্কে সচেতন হন (100% / 125% / 150% / 200%) নিম্নলিখিত কোড ব্যবহার করে আপনি আসল পর্দা আকার পেতে পারেন:
SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth
আমি আমার উইন্ডোজের প্রথমটি খোলার আগে পর্দার রেজোলিউশনটি পেতে চাইছিলাম, সুতরাং এখানে স্ক্রিনের মাত্রাগুলি মাপার আগে একটি অদৃশ্য উইন্ডো খোলার একটি দ্রুত সমাধান (উভয়ই উন্মুক্ত রয়েছে কিনা তা নিশ্চিত করার জন্য আপনাকে উইন্ডোটির প্যারামিটারগুলি আপনার উইন্ডোতে অভিযোজিত করতে হবে) একই পর্দা - প্রধানত 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();
এই "সেন্টার পর্দায় রয়েছে 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
আমার উইন্ডো অ্যাপ্লিকেশনটির সর্বাধিক আকার নির্ধারণ করা দরকার। প্রাথমিক স্ক্রিনে বা মাধ্যমিকটিতে অ্যাপ্লিকেশনটি প্রদর্শিত হচ্ছে সেই অনুযায়ী এটির পরিবর্তিত হতে পারে। এই সমস্যাটি কাটিয়ে উঠতে এবং একটি সহজ পদ্ধতি তৈরি করেছি যা আমি আপনাকে পরবর্তী দেখাব:
/// <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;
}
}
}
সি # উইনফর্মগুলিতে আমি নীচের পদ্ধতির সাহায্যে স্টার্ট পয়েন্ট পেয়েছি (যদি আমাদের বেশ কয়েকটি মনিটর / ডিপ্লে থাকে এবং একটি ফর্ম অন্যটিকে কল দিচ্ছে):
private Point get_start_point()
{
return
new Point(Screen.GetBounds(parent_class_with_form.ActiveForm).X,
Screen.GetBounds(parent_class_with_form.ActiveForm).Y
);
}
মাল্টি-মনিটর সেটআপগুলির জন্য আপনার এক্স এবং ওয়াই অবস্থানের জন্য অ্যাকাউন্টেরও প্রয়োজন হবে:
Rectangle activeScreenDimensions = Screen.FromControl(this).Bounds;
this.Size = new Size(activeScreenDimensions.Width + activeScreenDimensions.X, activeScreenDimensions.Height + activeScreenDimensions.Y);
এই ডিবাগিং কোডটি কৌশলটি ভালভাবে করা উচিত:
আপনি স্ক্রিন ক্লাসের বৈশিষ্ট্যগুলি ঘুরে দেখতে পারেন
স্ক্রিন ব্যবহার করে একটি অ্যারে বা তালিকায় সমস্ত প্রদর্শন রাখুন 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)