Xamarin.Macでディスプレイのスリープを解除する

提供: MonoBook
ナビゲーションに移動 検索に移動

Xamarin.Macで作ったアプリに対してLAN越しに通信があった際など、なんらかの条件が発生した際に「ディスプレイのスリープ」を解除したい。

実装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();
        }
    }
}

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

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