Windowsで日本語入力中にPhotoshopでショートカットを使えるように(擬似的に)する

AutoHotKeyを使って、"日本語入力直後にIMEを英語入力に戻す"よう設定することで、Windowsで日本語入力中にPhotoshopでショートカットを使えるように擬似的に動くようにしてみました。

ということなので、根本解決はしていません。
それどころか場合によっては、よけいに使いづらくなる場合もあるかもしれませんので、ご了承願います。

当方の環境(Windows11、Photoshop2024[v25.11.0]、AutoHotKey[v1.1.37.02])では正常に動きましたが、もし利用される際は、以下を読んで自己責任でご利用ください。


Read Me的なやつ

・AutoHotKeyは、v1を使ってください。

・スクリプトは、ChatGPTに書いてもらいました👏

・Photoshopがアクティブな状態でのみ動作するスクリプトになっています。

IMEの無効化をCtrl+Spaceで行うことを想定しています。 他のキーでIMEを切り替えている場合は、Send, ^{Space} の部分を適切なキーシーケンスに変更すれば良いです。(例えば、全角半角キーは Send, {vkF3sc029} に変更する)
一応全角半角キーの場合のスクリプトも併記しておきましたが、こちらは未検証なので、スクリプトが使えないようでしたら、ChatGPT等に聞いてみてください🙏

日本語IMEがオンのときに「Ctrl+Enter」と「Enterを2回連続で押したとき」にIMEを無効化するよう設定しています。これは、テキスト入力ツールを「Ctrl+Enter」で確定する動きと、レイヤー名称を編集後に「Enterを2回連続で押して」確定する動きです。この2点の動き以外で日本語を使用した場合は英語入力モードに戻りません(レイヤー名編集時に変換せず、1度のエンターで編集を確定した場合など。この場合は、その後にEnterを2回押すと楽かもしれません)。

・PCシャットダウン等でスクリプトが終了すると、次回起動時まで使えなくなります。なので、起動後にこのスクリプトが自動起動するように設定しないとかなり不便です。

・IMEの状態取得と設定のために以下のブログ記事で公開されていた関数を使用させていただいています。



スクリプト

#Persistent
#SingleInstance force
SetTitleMatchMode, 2

; PhotoshopがアクティブなときにIMEをオフにする
#IfWinActive, ahk_class Photoshop

; Ctrl+EnterでIMEをオフにする
^Enter::
    ; IMEが有効かどうかを確認
    if IME_IsON(WinExist("A")) {
        Send, ^{Enter}
        Sleep, 50 ; 少し待機
        IME_ON(WinExist("A"), 0) ; IMEを無効化
    } else {
        Send, ^{Enter}
    }
    return

; Enterを2回連続で押したときにIMEをオフにする
Enter::
    if (A_ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 400) {
        if IME_IsON(WinExist("A")) {
            Send, {Enter}
            Sleep, 100 ; 少し待機
            IME_ON(WinExist("A"), 0) ; IMEを無効化
        } else {
            Send, {Enter}
        }
    } else {
        Send, {Enter}
    }
    return

#IfWinActive

; IMEの状態を取得する関数
IME_IsON(hWindow) {
    ; WM_IME_CONTROL    = 0x0283
    ; IMC_GETOPENSTATUS = 0x0005
    bufCurrentDetectMode := A_DetectHiddenWindows
    DetectHiddenWindows, On
    buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
    DetectHiddenWindows, %bufCurrentDetectMode%
    Return buf
}

; IMEの状態を設定する関数
IME_ON(hWindow, IsON) {
    ; WM_IME_CONTROL    = 0x0283
    ; IMC_SETOPENSTATUS = 0x0006
    bufCurrentDetectMode := A_DetectHiddenWindows
    DetectHiddenWindows, On
    buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0006, "Int", IsON)
    DetectHiddenWindows, %bufCurrentDetectMode%
    Return buf
}


全角半角キーでIMEを切り替えている人はこちら

未検証なので、以下のスクリプトを使ってみて、使えないようでしたらChatGPT等に聞いてみてください🙏


#Persistent
#SingleInstance force
SetTitleMatchMode, 2

#IfWinActive, ahk_class Photoshop

^Enter::
    if IME_IsON(WinExist("A")) {
        Send, ^{Enter}
        Sleep, 50
        Send, {vkF3sc029} ; 全角半角キーを送信
    } else {
        Send, ^{Enter}
    }
    return

Enter::
    if (A_ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 400) {
        if IME_IsON(WinExist("A")) {
            Send, {Enter}
            Sleep, 100
            Send, {vkF3sc029} ; 全角半角キーを送信
        } else {
            Send, {Enter}
        }
    } else {
        Send, {Enter}
    }
    return

#IfWinActive

IME_IsON(hWindow) {
    bufCurrentDetectMode := A_DetectHiddenWindows
    DetectHiddenWindows, On
    buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
    DetectHiddenWindows, %bufCurrentDetectMode%
    Return buf
}

IME_ON(hWindow, IsON) {
    bufCurrentDetectMode := A_DetectHiddenWindows
    DetectHiddenWindows, On
    buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0006, "Int", IsON)
    DetectHiddenWindows, %bufCurrentDetectMode%
    Return buf
}


なにか良きアドバイスや、うまく使えた等の感想があればぜひコメントを書いていって下さいませ🙏


いいなと思ったら応援しよう!