ページ「.NET Core」と「Xamairn.Macで接続されているディスプレイの一覧を取得する」の間の差分

提供: MonoBook
(ページ間の差分)
ナビゲーションに移動 検索に移動
 
imported>Administrator
 
1行目: 1行目:
'''.NET Core'''とは、2016年6月27日に公開された、[[Windows]]、[[Mac OS X]]、[[Linux]]上で動作する軽量なプラットフォームである。
+
Macに接続されているディスプレイの一覧はCore GraphicsのCGGetOnlineDisplayListメソッドで取得できる。
 +
MacBookなどに外部ディスプレイを繋げてクラムシェル(ノートの蓋を閉じて使う)で使っている場合は本体側のディスプレイは結果に含まれない。
 +
そこまで取りたい場合について調べていない。
  
== 概要 ==
+
Xamarin.MacでP/Invokeメソッドの引数に配列に渡すときはIntPtrに変換する必要がある点が若干めんどくさい。
.NET Coreは従来の.NET Frameworkをもとにマルチプラットフォーム対応とそれにともなう最小公倍数的な軽量化が施されたものである。.NET Coreは従来の.NET Frameworkとは決別するという意味を込めてか、バージョンも1.0から仕切り直しとなっており、あくまで別物と考えておくのが無難である。
 
  
従来の.NETやASP.NETは「既にあるものを使う」という考えのもと「[[Windows]]の機能」や「[[IIS]]の機能」に依存して、[[C#|C Sharp]]などでの[[ピュア実装]](再実装)を放棄している部分が大多数であった。実際、[[オープンソース]]界隈でもJava愛好者は「[[C言語]]から[[Java]]に移植だ」となるところも、[[C#|C Sharp]]愛好者は「動けばいい」と[[P/Invoke]]するのが定番であった。
+
<source lang="csharp">
 +
using System;
 +
using System.Collections.Generic;
 +
using System.Linq;
 +
using System.Runtime.InteropServices;
  
しかし、時は流れ、[[スタンドアローン]]で動く[[アプリ]]が壊滅し、[[スマホ]]の[[ゲーム]]ですら[[サーバー]]必須の時代が到来し、さらに[[クラウド]]業界は[[Linux]]一色になってしまった。.NETも[[Linux]]対応が急務であったが、手抜きP/Invoke実装が足かせとなり[[Mono]]を使ってもボロボロという状況で他のプラットフォームに出遅れる結果となっていた。
+
using Foundation;
 +
using AppKit;
 +
using CoreGraphics;
  
そこで「イチから仕切り直しだ」となったようである。
+
namespace OnlineDisplayList
 +
{
 +
    [Register("AppDelegate")]
 +
    public class AppDelegate : NSApplicationDelegate
 +
    {
 +
        public AppDelegate()
 +
        {
 +
        }
  
従来の.NET Frameworkは単なる実行環境という雰囲気であったが、.NET Coreでは「dotnetコマンド」ひとつで、いちいちVisual Studioを立ちあげなくてもプロジェクトを作成でき、また地味に面倒な別PCでのビルド環境の復元も一発ででき、さらにビルドそのものも一発ででき、さらにさらに実行までできるようになっている。[[Linux]]がメインな人には扱いやすいかもしれない。
+
        [DllImport("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics")]
 +
        static extern int CGGetOnlineDisplayList(
 +
            int maxDisplays,
 +
            IntPtr onlineDisplays,
 +
            out int displayCount);
  
== インストール ==
+
        [DllImport("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics")]
* [[.NET Core/macOSにインストールする]]
+
        static extern CGRect CGDisplayBounds(int displayId);
 +
 
 +
        public override void DidFinishLaunching(NSNotification notification)
 +
        {
 +
            // ディスプレイ一覧を取得する
 +
            // MacBookなどでクラムシェルにしている場合は一覧に含まれない。
 +
            int    displayMax = 16;
 +
            int    displayCount = 0;
 +
            int    memSize = Marshal.SizeOf(typeof(UInt32)) * displayMax;
 +
            IntPtr memPtr  = Marshal.AllocCoTaskMem(memSize);
 +
 
 +
            CGGetOnlineDisplayList(displayMax, memPtr, out displayCount);
 +
 
 +
            int[] displays = new int[displayCount];
 +
            Marshal.Copy(memPtr, displays, 0, displayCount);
 +
 
 +
            Marshal.FreeCoTaskMem(memPtr);
 +
 
 +
            // ディスプレイ一覧から個々の位置と解像度を得る
 +
            foreach (var display in displays)
 +
            {
 +
                var rect = CGDisplayBounds(display);
 +
                Console.WriteLine(rect);
 +
            }
 +
        }
 +
    }
 +
}
 +
</source>
  
 
== 関連項目 ==
 
== 関連項目 ==
; 新
+
* [[Xamarin.Mac/Retina Displayか判別する]]
* [[.NET Core]]
+
* [[Xamarin.Mac/ディスプレイの設定変更を検出する]]
* [[ASP.NET Core]]
+
* [[Xamarin.Mac/NSOpenGLViewをRetina Displayに対応させる]]
* [[ASP.NET Core Identity]] (microsoft.aspnetcore.identity)
 
 
 
; 旧
 
* [[.NET Framework]]
 
  
 
== 参考文献 ==
 
== 参考文献 ==
28行目: 69行目:
  
 
{{stub}}
 
{{stub}}
 +
 +
[[category: Xamarin.Mac]]

2017年12月21日 (木) 07:22時点における最新版

Macに接続されているディスプレイの一覧はCore GraphicsのCGGetOnlineDisplayListメソッドで取得できる。 MacBookなどに外部ディスプレイを繋げてクラムシェル(ノートの蓋を閉じて使う)で使っている場合は本体側のディスプレイは結果に含まれない。 そこまで取りたい場合について調べていない。

Xamarin.MacでP/Invokeメソッドの引数に配列に渡すときはIntPtrに変換する必要がある点が若干めんどくさい。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;

using Foundation;
using AppKit;
using CoreGraphics;

namespace OnlineDisplayList
{
    [Register("AppDelegate")]
    public class AppDelegate : NSApplicationDelegate
    {
        public AppDelegate()
        {
        }

        [DllImport("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics")]
        static extern int CGGetOnlineDisplayList(
            int maxDisplays,
            IntPtr onlineDisplays,
            out int displayCount);

        [DllImport("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics")]
        static extern CGRect CGDisplayBounds(int displayId);

        public override void DidFinishLaunching(NSNotification notification)
        {
            // ディスプレイ一覧を取得する
            // MacBookなどでクラムシェルにしている場合は一覧に含まれない。
            int    displayMax = 16;
            int    displayCount = 0;
            int    memSize = Marshal.SizeOf(typeof(UInt32)) * displayMax;
            IntPtr memPtr  = Marshal.AllocCoTaskMem(memSize);

            CGGetOnlineDisplayList(displayMax, memPtr, out displayCount);

            int[] displays = new int[displayCount];
            Marshal.Copy(memPtr, displays, 0, displayCount);

            Marshal.FreeCoTaskMem(memPtr);

            // ディスプレイ一覧から個々の位置と解像度を得る
            foreach (var display in displays)
            {
                var rect = CGDisplayBounds(display);
                Console.WriteLine(rect);
            }
        }
    }
}

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]