メインメニューを開く

差分

Xamarin.MacでGlobal Event Monitorを使いキー入力を監視する

3,553 バイト追加, 2015年10月14日 (水) 06:16
ページの作成:「==概要== Xamarin.Macで開発している社内アプリで確実に動くファンクションキーを実現したい。 何も考えずに単純にキー入...」
==概要==
[[Xamarin.Mac]]で開発している社内アプリで確実に動く[[ファンクションキー]]を実現したい。

何も考えずに単純にキー入力を監視する実装にしたところ、一部で「[[キー]]を押しても動かない」という苦情が発生した。
原因は、ウインドウはひとつしか開いておらず、一見するとウインドウにフォーカスが当たっているように見えるが、実はデスクトップにフォーカスが当たっているという状況であった。
対策として、アプリ起動時に強制的にフルスクリーンにしてやろうかとも思ったが[[Windows 8]]並にスマートではないので、そのような状況でも動くファンクションキーの実装方法を模索している。

==実装==
===アプリを開発する===
NSEventにNSEvent.AddGlobalMonitorForEventsMatchingMaskを叩いて監視対象のイベントの種類と発生時に呼ばれるイベントハンドラを設定するだけである。
非常に簡単。
<source lang="csharp">
public override void DidFinishLaunching(NSNotification notification)
{
NSEvent.AddGlobalMonitorForEventsMatchingMask(NSEventMask.KeyDown, (theEvent) => {

Console.WriteLine("keydown: " + theEvent.Characters);
});

NSEvent.AddGlobalMonitorForEventsMatchingMask(NSEventMask.FlagsChanged, (theEvent) => {
var flags = theEvent.ModifierFlags & NSEventModifierMask.DeviceIndependentModifierFlagsMask;
if (flags == 0)
{
Console.WriteLine("release");
}
else
{
Console.WriteLine("modifier: " + flags);
}
});
}
</source>

===アプリを許可する===
Global Event Monitorは[[OS]]のあらゆるイベントを監視できるので[[スパイウェア]]や[[キーロガー]]などの非常に危ういアプリも簡単に作り放題となる。
そのため[[Mac OS X]]では[[システム環境設定]]から明示的にアプリを許可しないとGlobal Event Monitorは機能しないようになっている。
#左上のリンゴマークをクリック
#システム環境設定を開く
#セキュリティとプライバシーを開く
#プライバシーのタブを開く
#アクセシビリティを選ぶ
#左下の鍵マークをクリックして認証する
#中央のプラスマークをクリックして許可するアプリを追加する

なお、アクセシビリティの許可がされていない状態でGlobal Event Monitorを使用しているアプリを実行してもエラーも何も発生しない。
この挙動は確実に半年くらいしてどんな実装だったかを忘れたころにトラブルになり、[[エラー]]も出ないの[[でデバッグ]]も捗らず原因不明の[[バグ]]に悩まされ[[デスマーチ]]突入は決定的である。
そのためアプリ起動時にアクセシビリティの許可がされているかを確認し警告を出す方法を模索しているが、まだ解決方法は見つかっていない。

==関連項目==
*[[Xamarin.Mac/システム環境設定を開く]]
*[[MonoMac/フルスクリーン表示に対応する]]
*[[Xamarin.Mac/キーボードの入力をシミュレートする]]
*[[キーコード/Mac OS X]]

==参考文献==
{{reflist}}

{{stub}}

[[category:Xamarin.Mac]]
[[category:MonoMac]]
匿名利用者