0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

初めに

普段はiOSアプリの開発をしていますが、Macのアプリ(ソフト?)開発にもチャレンジしてみました。

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

新規プロジェクトの作成

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

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

クリックを検知する

クリックを検知させます。カスタムクラスを作り、そこでその設定をします。

MouseHighlight.swift
NSEvent.addGlobalMonitorForEvents(matching:.leftMouseDown ,handler:self.handlerMouseClickedMask(event:))

こうすると、マウスの左ボタンを押すとhandlerで指定した関数が実行されます。

次に実行させる関数です。

MouseHighlight.swift
private func handlerMouseClickedMask(event: NSEvent) {
    print("OK!")
    print("x ->\(NSEvent.mouseLocation.x)")
    print("y ->\(NSEvent.mouseLocation.y)")
}

私は試しに、OK!と出力させてみたり、
カーソルの座標を出力させてみました。

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

最後にカスタムクラスのコード全文を載せておきます。

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も、、、、

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
    }

}

最後に

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?