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

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
imported>Administrator
 
(相違点なし)

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);
            }
        }
    }
}

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

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