交互式中没有引用的 C# 屏幕大小
C# Screen size without references in interactive
我想获取主屏幕的屏幕尺寸,而不添加任何引用(例如 WinForms 或 Presentation)。我发现了一个类似的问题 here,但是没有解决方案不包括下载或类似的东西。
但我想制作一个方法,可以在任何其他电脑上的 C# interactive 中执行。因此我需要一个不引用标准之外的其他东西的解决方案(例如 System, System.Core, ... 是允许的).
我知道这可以用
System.Windows.Forms.Screen.PrimaryScreen.Bounds;
但是因为这需要System.Windows.Forms参考,所以不适合我。但基本上这个片段的结果是我想要得到的 without references.
如果您不想使用这些库,您可能需要使用本机方法。我想不出解决这个问题的方法,因为您需要以任何方式与系统通信。
System.Windows.Forms.Screen
的来源是一个不错的起点
Here's a link to the source。我打赌你可以剥离他们的代码,并获得最低限度。
我实际上找到了解决这个问题的方法:
using System;
using System.Runtime.InteropServices;
static void Main()
{
EnumWindows(E, IntPtr.Zero);
Console.Write($"{_.Item1}x{_.Item2}");
}
struct R
{
int l;
int t;
public int r;
public int b;
public override string ToString() => $"{l},{t},{r},{b}";
public bool i() => l == 0 && r != 00;
}
static (int, int) _;
static bool E(IntPtr w, IntPtr l)
{
var r = new R();
GetWindowRect(w, ref r);
if (r.i() && _.Item1 == 0)
_ = (r.r, r.b);
return true;
}
delegate bool P(IntPtr w, IntPtr l);
[DllImport("user32.dll")]
static extern bool EnumWindows(P e, IntPtr l);
[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr w, ref R r);
Main()
将其粘贴到您的交互中,它应该会输出屏幕分辨率 - 至少对我来说是这样。
不要问我它是如何工作的,它是从不同的教程中拼凑而成的,并被压入了交互式。因此,我不能保证这适用于每台电脑。
其他人可以测试一下吗?
这是我想出的一个例子。
我注意到它在高 DPI 屏幕上无法正常工作。它将报告表观分辨率,而不是实际分辨率。
static void Main(string[] args)
{
var size = GetScreenSize();
Console.WriteLine(size.Length + " x " + size.Width);
Console.ReadLine();
}
static Size GetScreenSize()
{
return new Size(GetSystemMetrics(0), GetSystemMetrics(1));
}
struct Size
{
public Size(int l, int w)
{
Length = l;
Width = w;
}
public int Length { get; set; }
public int Width { get; set; }
}
[DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern int GetSystemMetrics(int nIndex);
我想获取主屏幕的屏幕尺寸,而不添加任何引用(例如 WinForms 或 Presentation)。我发现了一个类似的问题 here,但是没有解决方案不包括下载或类似的东西。
但我想制作一个方法,可以在任何其他电脑上的 C# interactive 中执行。因此我需要一个不引用标准之外的其他东西的解决方案(例如 System, System.Core, ... 是允许的).
我知道这可以用
System.Windows.Forms.Screen.PrimaryScreen.Bounds;
但是因为这需要System.Windows.Forms参考,所以不适合我。但基本上这个片段的结果是我想要得到的 without references.
如果您不想使用这些库,您可能需要使用本机方法。我想不出解决这个问题的方法,因为您需要以任何方式与系统通信。
System.Windows.Forms.Screen
Here's a link to the source。我打赌你可以剥离他们的代码,并获得最低限度。
我实际上找到了解决这个问题的方法:
using System;
using System.Runtime.InteropServices;
static void Main()
{
EnumWindows(E, IntPtr.Zero);
Console.Write($"{_.Item1}x{_.Item2}");
}
struct R
{
int l;
int t;
public int r;
public int b;
public override string ToString() => $"{l},{t},{r},{b}";
public bool i() => l == 0 && r != 00;
}
static (int, int) _;
static bool E(IntPtr w, IntPtr l)
{
var r = new R();
GetWindowRect(w, ref r);
if (r.i() && _.Item1 == 0)
_ = (r.r, r.b);
return true;
}
delegate bool P(IntPtr w, IntPtr l);
[DllImport("user32.dll")]
static extern bool EnumWindows(P e, IntPtr l);
[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr w, ref R r);
Main()
将其粘贴到您的交互中,它应该会输出屏幕分辨率 - 至少对我来说是这样。
不要问我它是如何工作的,它是从不同的教程中拼凑而成的,并被压入了交互式。因此,我不能保证这适用于每台电脑。
其他人可以测试一下吗?
这是我想出的一个例子。
我注意到它在高 DPI 屏幕上无法正常工作。它将报告表观分辨率,而不是实际分辨率。
static void Main(string[] args)
{
var size = GetScreenSize();
Console.WriteLine(size.Length + " x " + size.Width);
Console.ReadLine();
}
static Size GetScreenSize()
{
return new Size(GetSystemMetrics(0), GetSystemMetrics(1));
}
struct Size
{
public Size(int l, int w)
{
Length = l;
Width = w;
}
public int Length { get; set; }
public int Width { get; set; }
}
[DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern int GetSystemMetrics(int nIndex);