C# C屏幕大小,不带交互参考
我希望获得主屏幕的屏幕大小,而不添加任何引用,例如WinForms或Presentation。我发现了一个类似的问题,但是没有不包括下载之类的解决方案 但是我想做一个方法,它可以在任何其他pc上的C中执行。因此,我需要一个解决方案,它不引用标准之外的其他东西,例如系统、系统核心。。。是允许的 我知道这是有可能的 System.Windows.Forms.Screen.PrimaryScreen.Bounds;C# C屏幕大小,不带交互参考,c#,.net,screen-size,c#-interactive,C#,.net,Screen Size,C# Interactive,我希望获得主屏幕的屏幕大小,而不添加任何引用,例如WinForms或Presentation。我发现了一个类似的问题,但是没有不包括下载之类的解决方案 但是我想做一个方法,它可以在任何其他pc上的C中执行。因此,我需要一个解决方案,它不引用标准之外的其他东西,例如系统、系统核心。。。是允许的 我知道这是有可能的 System.Windows.Forms.Screen.PrimaryScreen.Bounds; 但由于这需要System.Windows.Forms引用,因此不适合我。但基本上,这个
但由于这需要System.Windows.Forms引用,因此不适合我。但基本上,这个代码段的结果是我不需要引用就可以得到的。如果不想使用这些库,可能需要使用本机方法。我想不出一个方法来解决这个问题,因为你需要以任何方式与系统通信 一个好的起点是System.Windows.Forms.Screen的源代码
。我打赌你可以精简他们的代码,并获得最低限度。我实际上找到了一个解决方案:
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);
您可以使用winapi调用来获取它。您只需要使用msdn multiple display monitors引用在代码中输入一些pinvoke,就可以找到所需的调用。您能提供一个代码段吗?最好通过示例学习编码。我相信这个答案可能有助于@mykeels。这个解决方案的问题是它使用了对System.Drawing的引用。为什么不想使用任何常规引用?任何时候你有一个非常不寻常的要求,请解释一下。我确实试过了,但失败了。您能提供一个代码示例来实现这一点吗?没关系,如果包括一些本土的东西,我就不会说自己对它有经验。我会在有空闲时间的时候试一试,如果其他人不比我先试一试,可能需要几个小时,所以我希望你没有时间紧张。我没有,所以慢慢来:我实际上也发布了一个解决方案——不过这一个不是很漂亮,也不省钱,所以也许你也可以发布一个答案。不幸的是,我要到晚上才能测试它,但如果这个解决方案行得通的话,这是一个很棒的解决方案。