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 v2 | ComObject、Gui()、OnEvent、#HotIfを使う。v1のGui,や#IfWinActiveを混ぜない。 |
| Photoshop JSX | ExtendScriptの.jsxをDoJavaScriptFileへ渡す。UXPの.psjsの実行方法とは別。 |
| ProgID | Photoshop.Applicationのような文字列。COMの登録先を表し、必ず最新版を選ぶ保証ではない。 |
| CLSID | COMクラスの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コード





旧コードの参照資料(実行しない)
以下は旧記事のコードを保存した参照資料です。新しい例と混ぜて実行しないでください。旧配布リポジトリも今回更新していません。
旧コードは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、アクションのキー割り当てを用途に応じて確認できます。周辺機器の購入比較はデザノマの左手デバイス記事で扱います。





