質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

1回答

1754閲覧

OSXでアプリが非アクティブ時のドラッグ操作を正しく取得できない

KittenEar

総合スコア7

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2016/03/09 23:36

編集2016/03/10 13:33

###前提・実現したいこと
OSXのアプリをSwiftで作成しています。

自アプリが非アクティブのときに、ドラッグされたイベントを正しく取得したいのです。
つまり、外部アプリのドラッグアンドドロップ操作をフックしたい。

NSEvent.addGlobalMonitorForEventsMatchingMask
を使用して実現しようとしていますが、
ドラッグ開始1秒後〜ドラッグ終了直前までのイベントが正しく取得できません。

OSXのバージョン 10.11.2
Xcode Version 7.2.1
BaseSDK OSX 10.11

###現象
以下の画像は、マウスカーソルを(280, 320)から右方向におおよそ一定の速度でドラッグを行ったときのログです。
最初の方はイベントを取得できていますが、最後の2行を見ると、
(347, 319)から(1187, 319)まで一気に飛んでいます。
これはドラッグを終了した地点です。
イメージ説明

###ソースコード

Swift

1class ViewController: NSViewController { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 } 6 7 override func viewWillAppear() { 8 super.viewWillAppear() 9 10 NSEvent.addGlobalMonitorForEventsMatchingMask(.LeftMouseDraggedMask, handler: { (event: NSEvent) -> Void in 11 print(NSDate.init(), event.locationInWindow) 12 }) 13 14 } 15 16 override var representedObject: AnyObject? { 17 didSet { 18 } 19 } 20} 21

###補足情報
イベント監視の解放処理などは除いています。
自アプリのイベントを取得する
NSEvent.addLocalMonitorForEventsMatchingMask
では、ドラッグ処理を正しく取得できることを確認しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2016/03/10 09:34

マウスの移動じゃなくて、ドラッグなんですか?
KittenEar

2016/03/10 09:46

はい。ドラッグです。 以下の動作は正しく取得できることを確認しています。 ・マウスの移動 .MouseMovedMask ・左クリックダウン .LeftMouseDownMask ・左クリックアップ .LeftMouseUpMask
Stripe

2016/03/10 10:06

非アクティブの状態で、ドラッグイベントを拾うということは、そこでドロップするということですか?
KittenEar

2016/03/10 11:16

そうです。 非アクティブの状態でドラッグを開始し、 非アクティブの状態のままドロップします。
Stripe

2016/03/10 11:31

NSDraggingDestinationを利用しない理由は何ですか?
KittenEar

2016/03/10 12:39

NSEvent.addGlobalMonitorForEventsMatchingMask の第一引数が NSEventMask であり、 この NSDraggingDestination は定義されていないからです。 NSDraggingDestination をよく知らなかったので、調べてみると自アプリがD&Dを受け付けるときに使用するようですね。 これで実現可能かはまだ試していませんが、 実現したいことが正しく伝わっていなかったのかもしれません。 例えばですが、「計算機アプリをD&Dでウインドウの位置を変更した」ということを自アプリ側で取得したいのです。
Stripe

2016/03/10 12:49

ん? 計算機アプリ=自アプリですか?
KittenEar

2016/03/10 13:28

いえ、MacOSXの標準アプリのことです。自アプリ以外ならなんでもよかったのですが、一例をあげました。
guest

回答1

0

自己解決

自己解決。
コードに問題はなかった。
動作確認する場所が悪かった。
Xcode上でドラッグしていたため、ログ出力が止まっていただけだった。

投稿2016/03/19 10:47

KittenEar

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問