「Xamarin.Macでディスプレイのスリープを解除する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
 
(2人の利用者による、間の2版が非表示)
51行目: 51行目:
  
 
==関連項目==
 
==関連項目==
*[[Xamarin.Mac/AppleScriptを実行する‎]]
+
* [[Xamarin.Mac/スクリーンをロックする]]
*:[[AppleScript]]で似たようなことが出来れば[[言語]]を問わず汎用的なので現在模索している。
+
* [[Xamarin.Mac/AppleScriptを実行する‎]]
*[[Xamarin.Mac/キーボードの入力をシミュレートする]]
+
*: [[AppleScript]]で似たようなことが出来れば[[言語]]を問わず汎用的なので現在模索している。
*:[[スクリーンセーバー]]を解除するには[[キーボード]]が押された状態を再現するのが手っ取り早いようだ。
+
* [[Xamarin.Mac/キーボードの入力をシミュレートする]]
 +
*: [[スクリーンセーバー]]を解除するには[[キーボード]]が押された状態を再現するのが手っ取り早いようだ。
 +
* [[Xamarin.Mac/本体のシリアル番号を取得する]]
  
 
==参考文献==
 
==参考文献==

2018年7月18日 (水) 11:09時点における最新版

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

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

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