Xamarin.Macでディスプレイのスリープを解除する
実装1
Mac OS Xの標準ライブラリのひとつであるIOKitのIOPMAssertionDeclareUserActivityメソッドを叩くと「ディスプレイのスリープ」を解除できる[1]。 なお、この例では「コンピューターのスリープ」は解除できないので注意すること。
2015年7月時点のXamarin.MacにはIOKitが用意されていないようだ。そのためP/Invokeでそれらしく叩いてみた。これでいいかは知らんがとりあえず動いている。Xamarin.Mac依存ライブラリは使っていないのでMonoMacでも動くと思うが試してはいない。
using System;
using System.Runtime.InteropServices;
using AppKit;
using CoreFoundation;
namespace WakeUpDisplay
{
static class MainClass
{
enum IOPMUserActive
{
Local,
Remote,
}
[DllImport ("/System/Library/Frameworks/IOKit.framework/IOKit")]
static extern uint IOPMAssertionDeclareUserActivity(
IntPtr assertionName,
IOPMUserActive userType,
out uint assertionId);
static void Main(string[] args)
{
// NS〜クラスを使える状態にする
NSApplication.Init();
// デバッグ用のウェイト
// システム環境設定、Mission Control、ホットコーナーあたりで「ディスプレイのスリープ」を割り当てると捗る。
System.Threading.Thread.Sleep(1000 * 15);
// 「ディスプレイのスリープ」を解除する。
// 「コンピューターのスリープ」は解除されないので注意。
uint assertionId;
CFString name = "";
IOPMAssertionDeclareUserActivity(name.Handle, IOPMUserActive.Local, out assertionId);
name.Dispose();
}
}
}
関連項目
- Xamarin.Mac/スクリーンをロックする
- Xamarin.Mac/AppleScriptを実行する
- AppleScriptで似たようなことが出来れば言語を問わず汎用的なので現在模索している。
- Xamarin.Mac/キーボードの入力をシミュレートする