Xcode上で記述するAppleScriptアプリケーションにおいて、マウスカーソルを変更するAppleScriptです。
NSCursorにアクセスして、macOS側で用意しているカーソルにマウスカーソルのイメージを変更します。
あらかじめmacOSが用意しているカーソルはいくつかあるわけですが、これで満足するわけがなくて……任意のNSImageをカーソルに指定する方法について調べていたものの、なかなかうまくいかなかったので、このOS側で用意しているカーソルへの切り替えのみまとめておきました。
他のアプリケーションに切り替えると通常のカーソルに戻ってしまうので、本プロジェクト側でアプリケーション切り替えのイベントハンドラでカーソルの再変更などを行うべきなのかも。
set aImage to current application's NSImage's imageNamed:(current application's NSImageNameComputer) set tmpCursor to current application's NSCursor's alloc()'s initWithImage:aImage hotSpot:{0,15} tmpCursor's |set|()
結局、コンピュータのアイコンをマウスカーソルに指定するというところまでは持って行けた(カーソル画像の差し替えができた)わけなんですが、NSCursorの挙動を評価してみたら、カーソルが標準のものに戻るタイミングがバラバラ(他のディスプレイにカーソルが移動したとき、というわけでもない)で、挙動が謎すぎであります。
その後、対象のビュー(NSViewなど、その派生クラス)にマウスカーソルが入った/出たことを検出するイベントハンドラでマウスカーソルの形状変更を明示的に指定するような実装で落ち着きました(Edama2さんから教えていただきました。ありがとうございます)。
AppleScript名:AppDelegate.applescript |
— — AppDelegate.applescript — CursorTest — — Created by Takaaki Naganoya on 2020/03/24. — Copyright © 2020 Takaaki Naganoya. All rights reserved. — script AppDelegate property parent : class "NSObject" — IBOutlets property theWindow : missing value on applicationWillFinishLaunching:aNotification — Insert code here to initialize your application before any files are opened end applicationWillFinishLaunching: on applicationShouldTerminate:sender — Insert code here to do any housekeeping before your application quits return current application’s NSTerminateNoww end applicationShouldTerminate: on clicked:aSender set aTag to (aSender’s tag) as integer if aTag = 100 then current application’s NSCursor’s arrowCursor()’s |set|() else if aTag = 101 then current application’s NSCursor’s disappearingItemCursor()’s |set|() else if aTag = 102 then current application’s NSCursor’s contextualMenuCursor()’s |set|() else if aTag = 103 then current application’s NSCursor’s openHandCursor()’s |set|() end if end clicked: end script |
More from my site
(Visited 77 times, 1 visits today)