MacOSでカーソルポインターを作りたい。
解決したいこと
Macで、カーソルの周りに赤丸を表示したい。
Swift,XcodeでMacOS用のカーソルポインターを開発しています。
左クリックを検知することはできたのですが、その時にカーソルの周りに赤丸を表示しようとしてもできませんでした。
常駐アプリとして開発しているので、Viewはないです。
trackingAreaも使えないし、
NSScreen.mainにはaddSubViewのようなメソッドもないので
とても困っています。
そもそもが何か違うのでしょうか?
それとも何か解決策はあるのでしょうか?
該当するソースコード
下記のようにカスタムクラスを作って、それをAppDelegate.swiftの方で呼んであげています。
MouseHighlight.swift
//
// MouseHighlight.swift
// MouseTest
//
//
import Foundation
import Cocoa
class MouseHighlight: NSView {
private var trackingArea: NSTrackingArea?
private var eventMonitor: Any?
private func handlerMouseClickedMask(event: NSEvent) {
print("OK!")
print("x ->\(NSEvent.mouseLocation.x)")
print("y ->\(NSEvent.mouseLocation.y)")
let x = NSEvent.mouseLocation.x
let 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)
// 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
}
}
自分で試したこと
addCursorRectを使ってみましたがダメでした。
ほとんど手が出ない状況で申し訳ないのですが、助けていただくと幸いです。
0