Amazonで商品を見るセール会場へ

PhotoshopでAutoHotkey v2からJSXを実行する方法|キー割り当て・GUI・エラー対処

WindowsでPhotoshopのJSXをキーや外部ウィンドウのボタンから呼び出す例です。AutoHotkey v2のComObjectでPhotoshopへ接続し、DoJavaScriptFileへJSXの絶対パスを渡します。Photoshop内のメニューに登録する方法はスクリプトメニューへの登録で説明しています。

このページの新しい例はAutoHotkey v2用です。旧記事のv1コードと画像は後半の参照資料へ移しました。このPCでAutoHotkey常駐・COM接続・Photoshop実行・EXE変換は未検証です。例を使う前に自作のアラートだけで確認してください。

目次

v1・v2、JSX・PSJS、ProgID・CLSIDの違い

項目扱い
AutoHotkey v2ComObject、Gui()、OnEvent、#HotIfを使う。v1のGui,や#IfWinActiveを混ぜない。
Photoshop JSXExtendScriptの.jsxをDoJavaScriptFileへ渡す。UXPの.psjsの実行方法とは別。
ProgIDPhotoshop.Applicationのような文字列。COMの登録先を表し、必ず最新版を選ぶ保証ではない。
CLSIDCOMクラスのGUID。ProgIDと同じ呼び名ではない。

AutoHotkey公式のv2 ComObject資料は、COMオブジェクトを作成し、失敗時は例外を返す仕様を示しています。PhotoshopのWindows COM対応はAdobeのスクリプト資料、DoJavaScriptFileはAdobeのVBScript Referenceで確認できます。macOSではこのCOM例は使えません。

JSXを先にPhotoshopから参照実行する

AutoHotkey公式サイトからv2を導入し、launcher-v2.ahkとjsxフォルダーを同じ場所に置きます。v1が必要な旧スクリプトとは別のファイルで管理してください。各ファイル名をalert1.jsx、alert2.jsx、alert3.jsxとし、文字コードはUTF-8で保存します。

launcher-v2.ahk
jsx/
  alert1.jsx
  alert2.jsx
  alert3.jsx

alert1.jsx

alert("CGM test 1: " + app.version);

alert2.jsx

alert("CGM test 2: " + app.version);

alert3.jsx

alert("CGM test 3: " + app.version);

最初にPhotoshopのファイル→スクリプト→参照でalert1.jsxを実行します。CGM test 1とPhotoshop版を含むアラートが期待値です。この例は画像を変更・保存しません。参照からも失敗する場合は、ランチャーのキー設定より先にJSXの内容・拡張子・文字コードを確認します。

キーと3つのGUIボタンを登録する

次の内容をlauncher-v2.ahkとしてUTF-8 BOM付きで保存します。1つの完成例なので、旧v1のコードへ追記しないでください。キーはCtrl+Shift+F12です。利用環境の既存割り当てと競合する場合は、条件とキーを変更してから確認します。

#Requires AutoHotkey v2.0
#SingleInstance Force

RunJSX(path, *) {
    attributes := FileExist(path)
    if (!attributes || InStr(attributes, "D")) {
        MsgBox "JSXファイルがありません: " path
        return
    }
    try {
        ps := ComObject("Photoshop.Application")
        version := ps.Version
    } catch Error as err {
        MsgBox "PhotoshopへのCOM接続を確認してください。`n" err.Message
        return
    }
    try {
        ps.DoJavaScriptFile(path)
    } catch Error as err {
        MsgBox "JSX実行中のエラー。別の版で自動再実行しません。`n" err.Message
        return
    }
    MsgBox "呼出しが戻りました。Photoshop " version "`n文書や出力結果を別に確認してください。"
}

#HotIf WinActive("ahk_exe Photoshop.exe")
^+F12::RunJSX(A_ScriptDir "\jsx\alert1.jsx")
#HotIf

launcher := Gui(, "CGM JSX Launcher v2")
launcher.Add("Text", "w280", "Photoshop用のJSXを選択")
for scriptIndex in [1, 2, 3] {
    button := launcher.Add("Button", "w280", "アラート" scriptIndex)
    path := A_ScriptDir "\jsx\alert" scriptIndex ".jsx"
    button.OnEvent("Click", RunJSX.Bind(path))
}
launcher.OnEvent("Close", (*) => launcher.Hide())
launcher.Show()

A_ScriptDirはAHKファイルのある場所です。作業フォルダーや特定のユーザー名に依存するパスを避けています。3ボタンはBindで別々のファイルを渡します。GUIをクリックするとそのGUIが前面になるため、#HotIfはキーにだけ適用し、ボタンのコールバックをPhotoshop前面という条件で止めない構成です。

ComObjectは登録されたPhotoshopの起動につながることがあります。複数版がある場合は、戻り値に表示するVersionと実際のPhotoshop画面を照合してください。接続先を推測した版番号一覧で総当たりしません。JSXの途中エラーで別の版へ再接続して同じ処理を再実行すると、変更済みの文書へ二重処理するおそれがあるためです。

常駐・終了・実行結果を確認する

  • Photoshopを開き、launcher-v2.ahkをv2で実行する。起動した3ボタンのウィンドウでアラート1〜3を別々に試す。
  • Photoshopを前面にし、Ctrl+Shift+F12でtest 1が出るか確認する。別アプリ前面ではこのキーに反応しないことも確認する。
  • GUIの×は画面を隠すだけで、キーの常駐は続く。終了する場合はAutoHotkeyのトレイメニューからExitを選ぶ。
  • 表示されるPhotoshop版を記録する。アラート番号と回数が一致するか確認する。GUIが出ただけでPhotoshop実行成功とはしない。

以上は確認用の期待値で、今回の実機成功例ではありません。画像を編集・出力するJSXへ差し替える場合は、元画像のコピーで1回だけ実行し、保存先・枚数・内容・原本不変を別に確認します。例外表示がなくても望んだ処理が終わったとは限りません。

起動しない・実行できない場合の切り分け

症状確認順
AHKの構文エラーv2で開いているか、#Requires、旧v1構文の混入。
JSXファイルがないjsxフォルダーとalert1〜3.jsx、拡張子が.jsx.txtではないか。
COM接続で失敗Photoshopのインストール/更新とCOM登録、実行権限の違い、接続先の版。管理者実行を一律の対処にしない。
参照実行は通るがキーだけ失敗Photoshop前面、#HotIfの実行ファイル名、常駐状態、別のキー割り当てとの競合。
JSXの実行中に失敗対象文書とレイヤー・素材・パス・保存条件。変更済みの状態を確かめ、自動で再試行しない。

#HotIfの条件は公式の条件付きホットキー資料、GUIのイベントは公式OnEvent資料、Bindは公式Func資料を参照できます。Photoshop以外の一般的なWindowsキー操作は、このページの範囲外です。

EXE化する場合もPhotoshopとJSXは必要

公式Ahk2Exeはv1.1とv2のスクリプトをEXEへ変換できます。使用するv2のBaseを選び、コンパイルしたEXEで再確認します。新しい例は外部のjsxフォルダーを読むため、EXEだけを配布しても動きません。EXEと3つのJSXを同じ配置で渡し、PhotoshopのCOM登録とスクリプト互換性も確認してください。

アイコンは任意です。旧記事のPNG to ICO変換リンクは保持しています。右クリックのCompile Scriptが出るかは導入条件によるため、必ず表示されるとは扱いません。今回のEXE変換は未検証です。

旧記事の画面とv1コード

旧GUIランチャーのGeneral、View、Settingsタブ。今回のv2サンプルとは異なります。
旧GUIランチャーのGeneral、View、Settingsタブ。今回のv2サンプルとは異なります。 旧記事の掲載画像です。撮影日・詳細版は未確認です。
旧Illustratorのスクリプト警告。Photoshopの実行結果ではありません。
旧Illustratorのスクリプト警告。Photoshopの実行結果ではありません。 旧記事の掲載画像です。撮影日・詳細版は未確認です。
旧Photoshopのスクリプト警告。この更新で実行したものではありません。
旧Photoshopのスクリプト警告。この更新で実行したものではありません。 旧記事の掲載画像です。撮影日・詳細版は未確認です。
旧GUIランチャーの3ボタンとスクリプト警告。今回のv2サンプルとは異なります。
旧GUIランチャーの3ボタンとスクリプト警告。今回のv2サンプルとは異なります。 旧記事の掲載画像です。撮影日・詳細版は未確認です。
旧GUIランチャーのGeneral、View、Settingsタブ。今回のv2サンプルとは異なります。
旧GUIランチャーのGeneral、View、Settingsタブ。今回のv2サンプルとは異なります。 旧記事の掲載画像です。撮影日・詳細版は未確認です。
旧コードの参照資料(実行しない)

以下は旧記事のコードを保存した参照資料です。新しい例と混ぜて実行しないでください。旧配布リポジトリも今回更新していません。

旧コードはAutoHotkey v1の構文です。GUIの3番目がscript2を参照する箇所、関数内の版変数のスコープ、JSX実行例外まで別版への再試行に含める箇所に問題があります。ProgIDの文字列をCLSIDと同一視した旧説明もここからは引き継ぎません。

旧コード 1

jsxコピーする編集するalert ("こんにちは!ねむいねこだよ");

旧コード 2

#IfWinActive ahk_class Photoshop
; Ctrl+Shift+A でスクリプト実行
^+a::
    app:=ComObjCreate("Photoshop.Application")
    app.DoJavaScriptFile("C:\Users\min\Desktop\alert.jsx")
Return

旧コード 3

#IfWinActive ahk_class illustrator
; Ctrl+Shift+A でスクリプト実行
^+a::
    app:=ComObjCreate("Illustrator.Application")
    app.DoJavaScriptFile("C:\Users\min\Desktop\alert.jsx")
Return

旧コード 4

;Ctrl+Shift+A
^+a::
alert=
(
alert ("こんにちは!ねむいねこだよ");
)
app:=ComObjCreate("Photoshop.Application")
app.DoJavaScript(alert)
Return

旧コード 5

{
Gui, 1:Add, Button,W200 Gscript1, アラート1
Gui, 1:Add, Button,W200 Gscript2, アラート2
Gui, 1:Add, Button,W200 Gscript2, アラート3
Gui,1:Show,,スクリプトランチャー
return
}

script1:
Gui, 1:
#IfWinActive ahk_class Photoshop
app:=ComObjCreate("Photoshop.Application")
app.DoJavaScriptFile("C:\Users\min\Desktop\alert.jsx")
return

script2:
Gui, 1:
#IfWinActive ahk_class Photoshop
app:=ComObjCreate("Photoshop.Application")
app.DoJavaScriptFile("C:\Users\min\Desktop\alert.jsx")
return

script3:
Gui, 1:
#IfWinActive ahk_class Photoshop
app:=ComObjCreate("Photoshop.Application")
app.DoJavaScriptFile("C:\Users\min\Desktop\alert.jsx")
return

旧コード 6

{
Gui,+AlwaysOnTop
Gui, Add, Tab3,, General|View|Settings

Gui, 1:Add, Button,W200 Gscript1, アラート1
Gui, 1:Add, Button,W200 Gscript1, アラート2
Gui, 1:Add, Button,W200 Gscript3, アラート3

Gui, Tab, 2
Gui, 1:Add, Button,W200 Gscript1, アラート4
Gui, 1:Add, Button,W200 Gscript1, アラート5
Gui, 1:Add, Button,W200 Gscript1, アラート6

Gui, Tab, 3
Gui, 1:Add, Button,W200 Gscript1, アラート7
Gui, 1:Add, Button,W200 Gscript1, アラート8
Gui, 1:Add, Button,W200 Gscript1, アラート9

Gui,1:Show,,スクリプトランチャー
return
}

script1:
Gui,1:
#IfWinActive ahk_class Photoshop
app:=ComObjCreate("Photoshop.Application")
app.DoJavaScriptFile("C:\Users\min\Desktop\alert.jsx")
return

旧コード 7

;--------------------------------------------------
; Photoshop用スクリプトランチャー
;--------------------------------------------------
#IfWinActive ahk_class Photoshop
; Alt二連打で起動

PutEsc:
  Send,{alt}
return

$alt::
  WinGet, AWinHwnd, ID, A
  if (BefAWinHwnd == AWinHwnd) && (A_PriorHotkey == A_ThisHotkey) && (500 > A_TimeSincePriorHotkey) {

Gui,+AlwaysOnTop
Gui, Add, Tab3,, General|View|Settings

Gui, 1:Add, Button,W200 Gscript1, アラート1
Gui, 1:Add, Button,W200 Gscript2, アラート2
Gui, 1:Add, Button,W200 Gscript3, アラート3

Gui, Tab, 2
Gui, 1:Add, Button,W200 Gscript4, アラート4
Gui, 1:Add, Button,W200 Gscript5, アラート5
Gui, 1:Add, Button,W200 Gscript6, アラート6

Gui, Tab, 3
Gui, 1:Add, Button,W200 Gscript4, アラート7
Gui, 1:Add, Button,W200 Gscript5, アラート8
Gui, 1:Add, Button,W200 Gscript6, アラート9

Gui,1:Show,,スクリプトランチャー
return

  script1:
  Gui,1:
  #IfWinActive ahk_class Photoshop
  app:=ComObjCreate("Photoshop.Application")
  app.DoJavaScriptFile("sample.jsx")
  return


  } else {
    BefAWinHwnd := AWinHwnd
    SetTimer, PutEsc, -500
  }
  keywait, alt
return

旧コード 8

[photoshop]
version=Photoshop.Application.110

旧コード 9

Illustrator.Application.CS6
Illustrator.Application.CC.2017

旧コード 10

#InstallKeybdHook

IniFile = %A_WorkingDir%\setting.ini

psid = Photoshop.Application

IfExist, %IniFile%
{
IniRead, psid, setting.ini, photoshop, version
}

script1:
app:= ComObjCreate(psid)
app.DoJavaScriptFile("C:\Users\min\Desktop\alert.jsx")
MsgBox,%psid%
return

旧コード 11

#InstallKeybdHook

; バージョン定義
Default:="Photoshop.Application"
CC2019:="Photoshop.Application.130"
CC2018:="Photoshop.Application.120"
CC2017:="Photoshop.Application.110"
CC2015:="Photoshop.Application.90"
CC2014:="Photoshop.Application.80"
CC:="Photoshop.Application.70"
CS6:="Photoshop.Application.60"

; 実行するスクリプト
script1:="C:\Users\min\Desktop\alert.jsx"

; Photoshopスクリプト実行関数
PScript(Version, Script) {
    app := ComObjCreate(Version)
    app.DoJavaScriptFile(Script)
    MsgBox, %Version%
    return
}

; Photoshopのバージョンを順番に試して実行
go(Script) {  
    Try {
        PScript(Default, Script)
    } Catch e {
        Try {
            PScript(CC2019, Script)
        } Catch e {
            Try {
                PScript(CC2018, Script)
            } Catch e {
                Try {
                    PScript(CC2017, Script)
                } Catch e {
                    Try {
                        PScript(CC2015, Script)
                    } Catch e {
                        Try {
                            PScript(CC2014, Script)
                        } Catch e {
                            Try {
                                PScript(CC, Script)
                            } Catch e {
                                PScript(CS6, Script)
                            }
                        }
                    }
                }
            }
        }
    }
}

; スクリプトを実行
go(script1)

旧コード 12

"c:\Program Files\AutoHotkey\Compiler\Ahk2Exe.exe" /in C:\Users\ユーザー名\Desktop\フォトショップ.ahk /out C:\Users\ユーザー名\Desktop\フォトショップ.exe /icon C:\Users\min\Desktop\フォトショップ.ico
pause

旧配布リポジトリはMOTOKI-LLC/cg-method-codeです。今回のv2例とは別で、配布コードを更新していません。

ほかの呼出し方法・キー入力の導線

Photoshopの参照実行、既存の外部ランチャー、CEPのJSXLauncher、アクションのキー割り当てを用途に応じて確認できます。周辺機器の購入比較はデザノマの左手デバイス記事で扱います。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次