Je veux obtenir la taille d'écran de l'écran principal, sans ajouter de références (par exemple WinForms ou Présentation ). J'ai trouvé une question similaire ici, mais il n'y a pas de solution qui n'inclut pas le téléchargement ou quelque chose comme ça.

Mais je veux créer une méthode, qui peut être exécutée dans le C # interactif sur n'importe quel autre ordinateur. Par conséquent, j'ai besoin d'une solution qui ne fait pas référence à d'autres éléments que le standard (par exemple, System , System.Core , ... est autorisé).

Je sais que c'est possible avec

System.Windows.Forms.Screen.PrimaryScreen.Bounds;

Mais comme cela nécessite la référence System.Windows.Forms , cela ne me convient pas. Mais en gros, le résultat de cet extrait est ce que je veux obtenir sans références.

0
MetaColon 2 mai 2017 à 17:02

3 réponses

Meilleure réponse

Voici un exemple que j'ai trouvé.

J'ai remarqué que cela ne fonctionne pas correctement sur les écrans haute résolution. Il indiquera la résolution apparente, pas la résolution réelle.

    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);
1
Adam Schiavone 4 mai 2017 à 22:02

J'ai en fait trouvé une solution à cela:

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()

Collez-le dans votre interactif et il devrait afficher la résolution de l'écran - du moins pour moi.

Ne me demandez pas comment cela fonctionne, il est assemblé à partir de différents tutoriels et enfoncé dans l'interactif. Par conséquent, je ne peux pas garantir que cela fonctionnera sur tous les ordinateurs.

Quelqu'un d'autre pourrait-il tester ceci?

0
MetaColon 2 mai 2017 à 15:21

Si vous ne souhaitez pas utiliser ces bibliothèques, vous devrez probablement utiliser des méthodes natives. Je ne peux pas penser à un moyen de contourner cela, car vous devrez communiquer avec le système de toute façon.

Un bon point de départ serait la source de System.Windows.Forms.Screen

Voici un lien vers la source. Je parie que vous pourriez supprimer leur code et obtenir le strict minimum.

0
Adam Schiavone 2 mai 2017 à 14:08