2017-05-02 4 views
0

参照を一切追加せずに、プライマリ画面の画面サイズを取得したいとします(例:WinFormsまたはプレゼンテーション)。私は同様の質問hereを見つけましたが、ダウンロードやそれに類するものは含まれていません。C#インタラクティブで参照のない画面サイズ

しかし私は他のPCのC#interactiveで実行できる方法を作りたいと思います。したがって、標準以外のものを参照しないソリューションが必要です(たとえば、システム、System.Core、...が許可されています)。

私は、これは

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

で可能である知っていますが、これはのSystem.Windows.Forms参照を必要として、それは私には適していませんです。しかし、基本的にこのスニペットの結果は、の参照なしで取得したいものです。

+0

winapiコールを使用して取得できます。必要な呼び出しを見つけるために、msdnの "複数のディスプレイモニタのリファレンス"を使用してコードにピンボケが必要です。 –

+0

コードスニペットを提供できますか?コーディングは例を用いて最もよく学習されます。 – MetaColon

+0

私はこの答えはhttp://stackoverflow.com/a/43656496/7396801 – mykeels

答えて

1

ここに私が思いついた例があります。

High-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); 
+0

残念ながら、私は夕方までそれをテストすることはできませんが、これがうまくいくならば素晴らしいソリューションです。 – MetaColon

0

これらのライブラリを使用しない場合は、おそらくネイティブメソッドを使用する必要があります。私はあなたが行くどんな方法でもシステムと通信する必要があるので、これを回避する方法は考えられません。

System.Windows.Forms.Screen

Here's a link to the sourceの源になります開始するには良い場所。私はあなたが自分のコードを削除し、最小限のものを得ることができると確信しています。

+0

私は実際に試しましたが失敗しました。これを達成するためのコード例を教えてください。それは大丈夫です、いくつかのネイティブのものが含まれている場合、私はちょうどそれを経験して自分自身を呼び出すことはありません。 – MetaColon

+0

私はいくつかの自由な時間を(私はそれに私を打ち負かすことがない場合)それを与えるだろうそれは数時間かもしれないので、私はあなたが時間のクランチではないことを願っています。 –

+0

私はそうではありませんので、あなたの時間を取ってください:) – MetaColon

0

私は実際にこれに対する解決策が見つかりました:

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

がインタラクティブにこれを貼り付けて、出力画面の解像度なければならない - 少なくともそれは私のために行います。

は、それが別のチュートリアルから一緒に困惑し、インタラクティブに押し込まれています、それがどのように動作するか私に聞かないでください。したがって、私はこれがすべてのPCで動作することを保証することはできません。

誰かがこれをテストしてください。

関連する問題