Archive for the 'CGPostMouseEvent' Category

2016/04/27 AppleScriptから電話をかける v2

同一WiFiネットワーク内にある自分の(Macとひもづけした)iPhoneを利用して、Macから電話をかけるAppleScriptの強化版です。

GUI Scriptingを利用しているため、実行前にあらかじめ「システム環境設定」>「セキュリティとプライバシー」>「アクセシビリティ」で本Scriptを実行するアプリケーション(おそらく、スクリプトエディタ)にコンピュータの(GUI側からの)制御を許可するよう設定しておく必要があります。

単にopen locationで電話番号を呼び出しただけでは、通知センターが表示するウィンドウ上の「発信」ボタンをクリックする必要がありました。それを野蛮なGUI ScriptingやCocoaの怪しい機能を活用して、「発信」ボタンをクリックさせることで自動発信を行わせるものです。

本来なら、「発信」ボタンに対してクリックイベントを送ることになりますが、この「発信」ボタンはどうもUI Element Inspectorで調べてもボタンとして認識されなかったため、ウィンドウの位置とサイズの情報だけ取得して、座標を計算してマウスカーソルを強制移動させ、強制的にクリックさせています。そのため、ユーザーがマウスカーソルを動かしている状態だとクリックできない可能性があります。

座標値の計算結果の照合のため、MacBook Pro Retina Mid 2012(Retina解像度)と、MacBook Air Mid 2011で動作確認を行ってあります。もっと遅いマシンで実行する場合には、冒頭のdelayの秒数を増やすなどして調整してください。

tel1.png
▲open locationの実行直後

tel21.png
▲2秒待ったあと、AppleScriptで「発信」ボタンをクリック。本当に発信されている(この電話番号はたぶん実在しないため、スクリーンショットを撮ったあとで慌てて止めています)

AppleScript名:電話番号を呼び出すv2
– Created 2016-04-27 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ApplicationServices”
use framework “Quartz”

set telNo to “0312345678″ –only numeric characters

open location “tel://” & telNo
delay 2

activate application “NotificationCenter”
tell application “System Events”
  tell process “通知センター” –This name is localized (Japanese)
    set wCount to count every window
    
if wCount is not equal to 1 then return –ウィンドウが表示されていなかった、あるいは多数のウィンドウが表示されていた
    
    
tell window 1
      set {xPos, yPos} to position
      
set {xSize, ySize} to size
    end tell
    
  end tell
end tell

clickAt(xPos + xSize - 20, yPos + 20) of me

–マウスカーソルの強制移動とクリック
on clickAt(newX, newY)
  set pt to current application’s CGPointZero
  
set x of pt to newX
  
set y of pt to newY
  
current application’s CGPostMouseEvent(pt, 1, 1, 1)
  
current application’s CGPostMouseEvent(pt, 1, 1, 0)
end clickAt

★Click Here to Open This Script 

2015/10/04 マウスカーソルの強制移動とクリック

Cocoaの機能を用いて、画面上の指定座標にマウスカーソルを移動させてクリックを行うAppleScriptです。

AppleのドキュメントによればAPI(CGPostMouseEvent)自体はOS X 10.6でDeprecatedになっているはずですが、OS X 10.11上でも動作します。

GUI Scriptingでは手の出ない処理(実際にマウスカーソルを動かさないと応答しないタイプのアプリケーションの操作、主にAdobe系)のために補助的に用いることになるでしょう。

また、GUI Scriptingについても、本Scriptについても、「標準のScripting機能では手が出ない機能を呼び出す」ための手段であり、何から何までGUI Scriptingで座標指定してクリックしまくるべきではない(速度、確実さ)ということを明記しておきます。

追記:10.12でも動きました

AppleScript名:ASOCでマウスの強制移動とクリック
– Created 2015-10-04 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ApplicationServices”
use framework “Quartz”

my clickAt(100, 10)

on clickAt(newX, newY)
  
  
set pt to current application’s CGPointZero
  
set x of pt to newX
  
set y of pt to newY
  
  
current application’s CGPostMouseEvent(pt, 1, 1, 1)
  
current application’s CGPostMouseEvent(pt, 1, 1, 0)
  
end clickAt

★Click Here to Open This Script