Xamarin.Mac/マウスの移動を検出する

提供: MonoBook
移動: 案内検索

NSViewには「MouseEntered」「MouseMoved」「MouseExited」というズバリなイベントがある。 しかしこれらのイベントは初期状態では発動しないようになっている。

    public partial class MyView : AppKit.NSView
    {
        public override void MouseEntered(NSEvent theEvent)
        {
            base.MouseEntered(theEvent);
            Console.WriteLine("MouseEntered");
        }
 
        public override void MouseMoved(NSEvent theEvent)
        {
            base.MouseMoved(theEvent);
            Console.WriteLine("MouseMoved");
        }
 
        public override void MouseExited(NSEvent theEvent)
        {
            base.MouseExited(theEvent);
            Console.WriteLine("MouseExited");
        }
    }

これらのイベントを発動するにはNSViewのAddTrackingAreaメソッドで事前に「どの範囲で取るか」という指定をする必要がある。

        void Initialize()
        {
            var trackingArea = new NSTrackingArea(
                 rect: this.Bounds,
                 options: NSTrackingAreaOptions.ActiveAlways |
                          NSTrackingAreaOptions.InVisibleRect |
                          NSTrackingAreaOptions.MouseEnteredAndExited |
                          NSTrackingAreaOptions.MouseMoved,
                 owner: this,
                 userInfo: null);
 
            this.AddTrackingArea(trackingArea);
        }

範囲指定やオーナー指定はみたままなので特に問題ないと思う。

オプション(NSTrackingAreaOptions)は以下のような列挙体になっており、大きくわけて「取得したいイベントの種類」と「取得する条件」の3種類を組み合わせて使用する。

取得したいイベントの種類
MouseEnteredAndExited 1uL EnteredとExitedイベントを発生させる
MouseMoved 2uL Movedイベントを発生させる
CursorUpdate 4uL カーソル変化も発生させる
取得する条件1
ActiveWhenFirstResponder 16uL ビューにフォーカスのある時のみ取得する
ActiveInKeyWindow 32uL ウインドウがアクティブな時のみ取得する
ActiveInActiveApp 64uL アプリがアクティブな時のみ取得する(1アプリ複数ウインドウの場合は非アクティブでも取得)
ActiveAlways 128uL 常に取得する
取得する条件2
AssumeInside 256uL 内側にいる時すべて取得する
InVisibleRect 512uL 見えている範囲内のみ取得する
EnabledDuringMouseDrag 1024uL マウスのドラッグ中のみ取得する

関連項目[編集]

参考文献[編集]