【Swift/Cocoa】ウィンドウ外でクリックした座標を取得するaddGlobalMonitorForEventsの使い方!

今回は、Swiftを使ったCocoa Programmingで「ウィンドウ外をクリックした時の座標を取得する方法」について紹介します。

 

過去に紹介した「ウィンドウ内のクリック座標を取得する方法」と組み合わせることで、Macアプリのクリックポイントを取得できました。

addGlobalMonitorForEventsというコードを使えば簡単に実装できたのでチェックしてみてください。

はじめに

 

今回紹介する内容は、「Cocoa Programmingでウィンドウ外のクリック座標を取得する方法」です。

「ウィンドウ内のクリック座標を取得する方法」については過去に紹介しているので、合わせてチェックしてみてください。

 

 

それでは、早速使用するコードを見ていきましょう。

今回の動作は「XCode」で、言語は「Swift」を使っています。

 

addGlobalMonitorForEventsを使う

 

ウィンドウ外でクリック座標を取得するには「addGlobalMonitorForEvents」というコードを使うと簡単です。

 

こちらは

 

  1. 起動しているアプリ「以外」のイベントを監視するもの

 

今回の場合だと「起動しているウィンドウ以外でのクリックイベントを取得する」というようにして使います。

では続いて、実際の使用例と合わせてコードを見ていきましょう。

 

実際の使用例

 

今回の方法では、ViewController内に「TextField」を2つ設置し、それぞれ「xField」「yField」という名前で作成しました。

ウィンドウ外でクリックイベントが発生した時にXの座標とYの座標を表示させるためですね。

 

20180524153354

 

実際に使う場合、ViewController内にオブジェクトを設置する必要はなく、ログに表示するだけでもOKです。

環境や実装方法に合わせて調整してみてください。

 

それでは、Swiftを使ってTextFieldの値を変更していきましょう。

 

import Cocoa
class ViewController: NSViewController {
  @IBOutlet weak var xField: NSTextField!
  @IBOutlet weak var yField: NSTextField!
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    NSEvent.addGlobalMonitorForEvents(matching: .leftMouseDown, handler: {(event: NSEvent) -> Void in
      let clickPos = CGPoint(x: event.locationInWindow.x, y: event.locationInWindow.y)
      self.xField.stringValue = "X >>> (clickPos.x)"
      self.yField.stringValue = "Y >>> (clickPos.y)"
    })
  }
  override var representedObject: Any? {
    didSet {
      // Update the view, if already loaded.
    }
  }
}

 

こんな簡単なコードを設置するだけで、ウィンドウ外のクリック座標を取得できました。

 

コードの流れとしては

 

  1. xField, yFieldをアウトレット接続
  2. addGlobalMonitorForEventsでアプリ外のイベントを監視
  3. locationInWindowでイベントが発生した座標を取得(x, y)
  4. TextFieldのstringValueを取得しておいた座標に変換

 

実際にウィンドウ外をクリックしてみた結果がこちら。

 

20180524153408

20180524153418

 

取得するイベントを変更する

 

先ほどのコードでは「マウスの左クリック」を取得しました。

コード内の「.leftMouseDown」という部分が左クリックに当たるのですが、ちょっと書き換えれば「右クリック」や「ドラッグ」「スクロール」などのイベントに変更できるので試してみてください。

 

NSEvent.addGlobalMonitorForEvents(matching: ここがクリックイベント, handler: {(event: NSEvent) -> Void in })

 

コード イベント
.leftMouse〇〇 左クリック
.rightMouse〇〇 右クリック
.〇〇Down 押した時
.〇〇Up 離した時
.〇〇Dragged ドラッグ時
.scrollWheel スクロールホイール

 

取得したいイベントに合わせて書き換えて使ってみてください。

 

アクセシビリティが必要かも

 

今回紹介したようなイベントを取得する場合、Macからアプリケーションの許可が必要になるかもしれません。

システム環境設定」を開き、セキュリティとプライバシーを表示してください。

 

20180524153435

 

この中の「プライバシー」を選択します。

 

20180524154443

 

アクセシビリティ」を選択し、左下の「+ボタン」からXCodeを追加しましょう。

 

20180524153606

 

作成中のアプリであれば、XCodeを追加すればOKです。

正しく書いているのにうまく動作しない時は、この項目をチェックしてみてください。

 

まとめ

 

今回紹介した方法を使うことで、Macアプリのウィンドウ外でクリックイベントを取得することができました。

比較的簡単に実装できたので、ぜひ試してみてください。

 

 

ではまた。

 

過去にレビューしたアイテム