初めに
普段はiOSアプリの開発をしていますが、Macのアプリ(ソフト?)開発にもチャレンジしてみました。
クリックした時に、カーソルを目立たせることができれば便利だなと思いカーソルポインターアプリを作ってみようと思いました。
クリックを検知して、カーソルの周りに赤丸を表示させるのをゴールとしました。
結果から言うと、分からなすぎて断念しました。
ですが一応クリックを検知するところまではできたので、自分の備忘録がわりに書かせていただきます。
新規プロジェクトの作成
XcodeでMacアプリを作成するときは、新規プロジェクト作成の時にプラットフォームをmacOS、そしてAppを選択します。
詳しいやり方は検索すれば出てきます。
次に、常駐化させたいのでその処理も行います。
これも「Mac 常駐アプリ 作り方」とかで検索すれば出てきます。
クリックを検知する
クリックを検知させます。カスタムクラスを作り、そこでその設定をします。
NSEvent.addGlobalMonitorForEvents(matching:.leftMouseDown ,handler:self.handlerMouseClickedMask(event:))
こうすると、マウスの左ボタンを押すとhandlerで指定した関数が実行されます。
次に実行させる関数です。
private func handlerMouseClickedMask(event: NSEvent) {
print("OK!")
print("x ->\(NSEvent.mouseLocation.x)")
print("y ->\(NSEvent.mouseLocation.y)")
}
私は試しに、OK!と出力させてみたり、
カーソルの座標を出力させてみました。
本当はここで赤丸を表示させたかったのですが、どうすればいいのか全く分からず
一旦中断しました。
でもクリックイベントを検知したり、カーソルの座標を取得できたのは良い経験だったとも思います。
最後にカスタムクラスのコード全文を載せておきます。
//
// 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も、、、、
//
// 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
}
}
最後に
今回はカーソルのクリックイベント検知、カーソルの座標取得までしか出来ませんでしたが
いつかちゃんと赤丸を表示させられるようになりたいです。
今回の記事に関して、質問や解決方法を知っている方がいればコメントお願いします。
最後までお読みいただきありがとうございました。