Macでカーソルポインターアプリを作ろうとしてみた[Macアプリ]

# 初めに
普段はiOSアプリの開発をしていますが、Macのアプリ（ソフト？）開発にもチャレンジしてみました。

クリックした時に、カーソルを目立たせることができれば便利だなと思いカーソルポインターアプリを作ってみようと思いました。
クリックを検知して、カーソルの周りに赤丸を表示させるのをゴールとしました。
結果から言うと、分からなすぎて断念しました。
ですが一応クリックを検知するところまではできたので、自分の備忘録がわりに書かせていただきます。

# 新規プロジェクトの作成
XcodeでMacアプリを作成するときは、新規プロジェクト作成の時にプラットフォームをmacOS、そしてAppを選択します。
詳しいやり方は検索すれば出てきます。

次に、常駐化させたいのでその処理も行います。
これも「Mac 常駐アプリ　作り方」とかで検索すれば出てきます。

# クリックを検知する
クリックを検知させます。カスタムクラスを作り、そこでその設定をします。
```swift:MouseHighlight.swift
NSEvent.addGlobalMonitorForEvents(matching:.leftMouseDown ,handler:self.handlerMouseClickedMask(event:))
```
こうすると、マウスの左ボタンを押すとhandlerで指定した関数が実行されます。

次に実行させる関数です。
```swift:MouseHighlight.swift
private func handlerMouseClickedMask(event: NSEvent) {
    print("OK!")
    print("x ->\(NSEvent.mouseLocation.x)")
    print("y ->\(NSEvent.mouseLocation.y)")
}
```
私は試しに、OK！と出力させてみたり、
カーソルの座標を出力させてみました。

本当はここで赤丸を表示させたかったのですが、どうすればいいのか全く分からず
一旦中断しました。
でもクリックイベントを検知したり、カーソルの座標を取得できたのは良い経験だったとも思います。

最後にカスタムクラスのコード全文を載せておきます。
```swift:MouseHighlight.swift
//
//  MouseHighlight.swift
//  MouseTest
//
//

import Foundation
import Cocoa

class MouseHighlight: NSView {
    

    
    private var eventMonitor: Any?
    
    private func handlerMouseClickedMask(event: NSEvent) {
        print("OK!")
        
        print("x ->\(NSEvent.mouseLocation.x)")
        print("y ->\(NSEvent.mouseLocation.y)")
        let image = NSImage(named: "StatusBarButtonImage")
        let size = CGSize(width: 50, height: 50)
        let rect = NSRect(origin: .zero, size: size)
        let cursor = NSCursor(image: image!, hotSpot: .zero)
//        NSCursor.currentSystem?.image = image!
//        NSCursor.currentSystem?.pop()
//        NSCursor.crosshair.push()
//        addCursorRect(rect, cursor: cursor)
        
    }
    
    
    
    public func start() {
        stop()
        eventMonitor = NSEvent.addGlobalMonitorForEvents(matching:.leftMouseDown ,handler:self.handlerMouseClickedMask(event:))
        
    }
    
    public func stop() {
        guard let eventMonitor = eventMonitor else {
            return
        }
        
        NSEvent.removeMonitor(eventMonitor)
        self.eventMonitor = nil
        
    }
    
}
```
一応AppDelegate.swiftも、、、、
```swift:AppDelegate.swift
//
//  AppDelegate.swift
//  MouseTest
//
//

import Cocoa


class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application
        
        let options = NSDictionary(object: kCFBooleanTrue, forKey: kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString) as CFDictionary
        let trusted = AXIsProcessTrustedWithOptions(options)
       let mouseHighlight = MouseHighlight()
        if(trusted) {
            mouseHighlight.start()
        }
        
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }

    func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {
        return true
    }

}
```

# 最後に
今回はカーソルのクリックイベント検知、カーソルの座標取得までしか出来ませんでしたが
いつかちゃんと赤丸を表示させられるようになりたいです。

今回の記事に関して、質問や解決方法を知っている方がいればコメントお願いします。

最後までお読みいただきありがとうございました。