「Xamarin.Macでディスプレイのスリープを解除する」の版間の差分
ナビゲーションに移動
検索に移動
(→関連項目) |
|||
53行目: | 53行目: | ||
*[[Xamarin.Mac/AppleScriptを実行する]] | *[[Xamarin.Mac/AppleScriptを実行する]] | ||
*:[[AppleScript]]で似たようなことが出来れば[[言語]]を問わず汎用的なので現在模索している。 | *:[[AppleScript]]で似たようなことが出来れば[[言語]]を問わず汎用的なので現在模索している。 | ||
+ | *[[Xamarin.Mac/キーボードの入力をシミュレートする]] | ||
+ | *:[[スクリーンセーバー]]を解除するには[[キーボード]]が押された状態を再現するのが手っ取り早いようだ。 | ||
==参考文献== | ==参考文献== |
2015年7月3日 (金) 01:53時点における版
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();
}
}
}
関連項目
- Xamarin.Mac/AppleScriptを実行する
- AppleScriptで似たようなことが出来れば言語を問わず汎用的なので現在模索している。
- Xamarin.Mac/キーボードの入力をシミュレートする