ページ「.NET Core」と「Xamairn.Macで接続されているディスプレイの一覧を取得する」の間の差分
(ページ間の差分)
ナビゲーションに移動
検索に移動
(→関連項目) |
imported>Administrator 細 (Administrator がページ「Xamairn.Mac/接続されているディスプレイの一覧を取得する」を「Xamairn.Macで接続されているディスプレイの一覧を取得する」に移動しました) |
||
1行目: | 1行目: | ||
− | + | Macに接続されているディスプレイの一覧はCore GraphicsのCGGetOnlineDisplayListメソッドで取得できる。 | |
+ | MacBookなどに外部ディスプレイを繋げてクラムシェル(ノートの蓋を閉じて使う)で使っている場合は本体側のディスプレイは結果に含まれない。 | ||
+ | そこまで取りたい場合について調べていない。 | ||
− | + | Xamarin.MacでP/Invokeメソッドの引数に配列に渡すときはIntPtrに変換する必要がある点が若干めんどくさい。 | |
− | . | ||
− | + | <source lang="csharp"> | |
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
== 関連項目 == | == 関連項目 == | ||
− | + | * [[Xamarin.Mac/Retina Displayか判別する]] | |
− | + | * [[Xamarin.Mac/ディスプレイの設定変更を検出する]] | |
− | * [[ | + | * [[Xamarin.Mac/NSOpenGLViewをRetina Displayに対応させる]] |
− | * [[ | ||
− | |||
− | |||
− | * [[. | ||
== 参考文献 == | == 参考文献 == | ||
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);
}
}
}
}
関連項目[編集 | ソースを編集]
- Xamarin.Mac/Retina Displayか判別する
- Xamarin.Mac/ディスプレイの設定変更を検出する
- Xamarin.Mac/NSOpenGLViewをRetina Displayに対応させる