Archive for the 'NSEvent' Category

2016/07/10 マウスカーソルのグローバルな現在座標を取得する

マウスカーソルのグローバルな現在座標を取得するAppleScriptです。

複数モニタを接続している状態で、すべてのモニタを組み合わせたグローバルなマウスカーソルの位置座標を取得するAppleScriptです。ただし、得られる座標系はCocoaの座標系であることに注意が必要です。

AppleScriptの座標系はメインモニタの左上が{0, 0}であるため、GUI Scriptingや各種アプリケーションのウィンドウの位置や大きさなどと合わせるためには若干の計算が必要になります。

AppleScriptでも、InDesign、Illustrator、Photoshopなどアプリケーションによって座標系は変わってきますので、そのあたりは常に注意する必要があります。

corrdinate_resized2.png

AppleScript名:ASOCでマウスカーソルのグローバルな現在座標を取得する
– Created 2016-07-10 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aLoc to current application’s NSEvent’s mouseLocation()
set {xPos, yPos} to {x of aLoc, y of aLoc}
return {xPos, yPos}

★Click Here to Open This Script 

2015/10/05 キー入力チェック

Cocoaの機能を用いてキー入力チェックを行うAppleScriptです。Shane Stanleyが2年前に記述したScriptの強化版です。

AppleScriptの処理系自体にはキースキャンの機能はないため、

 ‖召離▲廛螢院璽轡腑鵑竜’修鰺用する
 ▲機璽疋僉璽謄の追加命令(Scripting Addition、OSAX)の機能を利用する
 shell scriptの機能を利用する
 Xcode上でAppleScriptを記述して、Cocoaの機能や他のObjective-Cなどの機能を呼び出す

というあたりが定番でしたが、OS X 10.10から、

 Script Editor上で記述するAppleScriptで、Cocoaの機能を呼び出す

ことができるようになったため、比較的かんたんに(追加アプリやファイルのインストールなしに)実現できるようになってきました。

ただし、ここで言う「キー入力チェック」の対象となるキーは、「Caps」「Shift」「Control」「Option」「Command」「fn」などのいわゆる「装飾キー」と呼ばれる種類のキーです。

key1.png

AppleScriptのアプレットにおいて、起動時に何かのキーを押していると通常とは異なる機能を実行するような、そういう地味な用途に用いられるものです。

key2.png

とりあえず、Script Editor上でログ表示させると、これら装飾キーの入力状況をログ表示します。最初のバージョンでは同時に1つのキー判定しかしていませんでしたが、本Scriptでは対象となる装飾キーの複数同時入力の検出をサポートしています。

AppleScript名:キー入力チェック
– Created 2013-10-14 by Shane Stanley
– Modified 2015-10-05 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit” – for NSEvent

set chkList to {“fn”, “”, “”, “Command”, “Option”, “Control”, “Shift”, “Caps”}

repeat 100 times
  set theKey to current application’s NSEvent’s modifierFlags() as integer
  
set aBin to binaryEncode(theKey) of me
  
set detectStr to text 9 thru 16 of aBin
  
set detectList to characters of detectStr
  
set aList to {}
  
set aCount to 1
  
repeat with i in detectList
    set j to contents of i
    
if j = “1″ then
      set jj to contents of item aCount of chkList
      
set the end of aList to jj
    end if
    
set aCount to aCount + 1
  end repeat
  
  
log aList
  
delay 0.5
end repeat

–0〜2^32範囲の10進数を2進数の文字列に変換して返す
on binaryEncode(aNum)
  if aNum < 0 or 67108864 < aNum then return false
  
set bitStr to “”
  
  
repeat with i from 31 to 0 by -1
    try
      set aRes to aNum div (2 ^ i)
      
set aNum to aNum mod (aRes * (2 ^ i))
    on error
      set aRes to 0
    end try
    
    
set aRes to aRes as integer
    
set bitStr to bitStr & (aRes as string)
  end repeat
  
  
return bitStr
end binaryEncode

★Click Here to Open This Script