前提・実現したいこと
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)まで一気に飛んでいます。
これはドラッグを終了した地点です。
ソースコード
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear() {
super.viewWillAppear()
NSEvent.addGlobalMonitorForEventsMatchingMask(.LeftMouseDraggedMask, handler: { (event: NSEvent) -> Void in
print(NSDate.init(), event.locationInWindow)
})
}
override var representedObject: AnyObject? {
didSet {
}
}
}
補足情報
イベント監視の解放処理などは除いています。
自アプリのイベントを取得する
NSEvent.addLocalMonitorForEventsMatchingMask
では、ドラッグ処理を正しく取得できることを確認しています。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
自己解決。
コードに問題はなかった。
動作確認する場所が悪かった。
Xcode上でドラッグしていたため、ログ出力が止まっていただけだった。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Stripe
2016/03/10 18:34
マウスの移動じゃなくて、ドラッグなんですか?
KittenEar
2016/03/10 18:46
はい。ドラッグです。
以下の動作は正しく取得できることを確認しています。
・マウスの移動 .MouseMovedMask
・左クリックダウン .LeftMouseDownMask
・左クリックアップ .LeftMouseUpMask
Stripe
2016/03/10 19:06
非アクティブの状態で、ドラッグイベントを拾うということは、そこでドロップするということですか?
KittenEar
2016/03/10 20:16
そうです。
非アクティブの状態でドラッグを開始し、
非アクティブの状態のままドロップします。
Stripe
2016/03/10 20:31
NSDraggingDestinationを利用しない理由は何ですか?
KittenEar
2016/03/10 21:39
NSEvent.addGlobalMonitorForEventsMatchingMask の第一引数が NSEventMask であり、
この NSDraggingDestination は定義されていないからです。
NSDraggingDestination をよく知らなかったので、調べてみると自アプリがD&Dを受け付けるときに使用するようですね。
これで実現可能かはまだ試していませんが、
実現したいことが正しく伝わっていなかったのかもしれません。
例えばですが、「計算機アプリをD&Dでウインドウの位置を変更した」ということを自アプリ側で取得したいのです。
Stripe
2016/03/10 21:49
ん?
計算機アプリ=自アプリですか?
KittenEar
2016/03/10 22:28
いえ、MacOSXの標準アプリのことです。自アプリ以外ならなんでもよかったのですが、一例をあげました。