C# C屏幕大小,不带交互参考

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引用,因此不适合我。但基本上,这个

我希望获得主屏幕的屏幕大小,而不添加任何引用,例如WinForms或Presentation。我发现了一个类似的问题,但是没有不包括下载之类的解决方案

但是我想做一个方法,它可以在任何其他pc上的C中执行。因此,我需要一个解决方案,它不引用标准之外的其他东西,例如系统、系统核心。。。是允许的

我知道这是有可能的

System.Windows.Forms.Screen.PrimaryScreen.Bounds;
但由于这需要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的引用。为什么不想使用任何常规引用?任何时候你有一个非常不寻常的要求,请解释一下。我确实试过了,但失败了。您能提供一个代码示例来实现这一点吗?没关系,如果包括一些本土的东西,我就不会说自己对它有经验。我会在有空闲时间的时候试一试,如果其他人不比我先试一试,可能需要几个小时,所以我希望你没有时间紧张。我没有,所以慢慢来:我实际上也发布了一个解决方案——不过这一个不是很漂亮,也不省钱,所以也许你也可以发布一个答案。不幸的是,我要到晚上才能测试它,但如果这个解决方案行得通的话,这是一个很棒的解决方案。