アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

UWSCでGIMPのテキストボックスを有効にする

GIMPのテキストボックスを有効にするには結構めんどくさくて、例えば文字の位置を直してから文字を書き直したりサイズを変更したりを繰り返すと手間がかかる。
テキストモードにしてテキストボックスをクリックしてさらに文字を全角にしなければならない。テキストボックスを移動する際も文字の上をクリックしなければ文字移動できず面倒。
かなりの手間なので自動化してみたのだけど、結構躓いたので詳細をメモ。

キーマクロソフト比較

今回uwscを使ったがuwscは検索によると作者さんがお亡くなりになっており、今後windowsアップデートで突然使えなくなる可能性もあるので他の方法を探してみたがそれも非常に面倒だった。

autohotkey

全角半角の分岐は正しく判断できたものの、GIMPへのキー入力が入ったりはいらなかったりする現象が起きた。

mkmacro

そもそもウィンドウを指定しての入力ができなかった(アクティブなウィンドウの名前を取得後でウィンドウをアクティブにすることは可能)。それに作者さんからそろそろ更新をやめるかもというお知らせもあった。

HiMacroEX

ウィンドウを有効にする方法はあるがなぜかGIMPのウィンドウをアクティブにすることができなかった。

Pulover’s Macro Creator

使いやすいがそもそもautohotkeyをベースに作られているのでautohotkeyと結果は同じ。

autoit

全角半角キーを押すのが面倒である様子。

uwscr

uwscを再現しようとしているソフト。まだ実装されてないコマンドもあるが過去に作ったuwsファイルがそのまま使えるのはすごい。

ClickerAce

非常に簡単にマクロが作れる。ウィンドウを指定してキーマクロができる。ただし単一のソフトのみの指定になる。小さく常駐する機能がないため他のマクロと組み合わせづらい。

pyautogui

pythonの習熟が必要。ウィンドウを指定して入力ができないがアクティブなウィンドウ名を詳細に指定できる。
exe化すると遅いので.pywとして起動するのが良さげ。
後日自作した経緯を別で書く。

結論

UWSCがつかえなくなった場合autohotkeyで判断させ分岐後は別のマクロソフトのファイルでキー入力させるというまどろっこしい手段を使わなければならない。
pythonでexeファイルを作り込むのも手だが完全に個人用になってしまう。

注:GIMPのテキストボックスの移動を楽にする方法
「ツールオプション」→移動対象「レイヤー」→「アクティブレイヤーを移動」にすると透明部分をクリックしても移動ができるようになる。

UWSC

UWSCではTGL_IMEで半角か全角か判断がつくはずなんだがうまくいかなかった。
毎回半角の方にしか分岐してくれなかった。
注:キーボードショートカットで「キャンバスのテキスト編集」をCTRL+Rに設定してある

ID = GETID("GIMP","gdkWindowToplevel",-1)
CTRLWIN(ID,NORMAL)
MOUSEORG(ID, 2)
IFB GETKEYSTATE(TGL_IME)=TRUE THEN
	//全角ひらがなの場合
	SCKEY(ID,VK_ESC)
	SCKEY(ID,VK_KANJI)
	SCKEY(ID,VK_T)
	SCKEY(ID,VK_CTRL,VK_R)
	SCKEY(ID,VK_KANJI)
	MSGBOX("zennkaku")

ELSE THEN
	//半角英数の場合	
	SCKEY(ID,VK_ESC)
	SCKEY(ID,VK_T)
	SCKEY(ID,VK_CTRL,VK_R)
	SCKEY(ID,VK_KANJI)
	MSGBOX(GETKEYSTATE(TGL_IME))
ENDIF
ACW(ID)

最終的に全角半角の判断はあきらめて現在の入力方法が全角だろうが半角だろうがすべからくIMEのショートカットキーで半角英数にしてからGIMPを操作してその後全角にするという手順にした。
注:IMEショートカットキーはCRTL+F10→N→Fかshifi+無変換
shift+無変換のショートカットキー確認方法:IMEの文字アイコン右クリック→プロパティ→詳細設定→全般タブの→編集操作→使用しているIMEを選ぶ→変更)

ID = GETID("GIMP","gdkWindowToplevel",-1)
CTRLWIN(ID,NORMAL)
MOUSEORG(ID, 2)
SCKEY(ID,VK_ESC)

//ctrl+F10→N→Fの場合
//SCKEY(ID,VK_CTRL,VK_F10)
//SLEEP(0.1)
//SCKEY(ID,VK_N)
//SCKEY(ID,VK_F)

//shift+無変換の場合
SCKEY(ID,VK_SHIFT,VK_NONCONVERT)

SCKEY(ID,VK_T)
SCKEY(ID,VK_CTRL,VK_R)
SCKEY(ID,VK_KANJI)

ACW(ID)

autohotkey

半角全角の判断はできたがGIMP側にキー入力を流し込むことができなかった。
ウィンドウはアクティブにできたので他のマクロソフトと組み合わせるしか方法がない。
titile一部一致指定では画像ウィンドウがアクティブにならずid指定でようやくウィンドがアクティブになった。なかった。

#WinActivateForce
SetTitleMatchMode, 2
WinGet,gimp_id,, – GIMP
WinActivate,ahk_id %gimp_id%
While IfWinNOTActive,ahk_id %gimp_id%
{
}
Gosub, IMEGetstate
	If (vimestate=1)
		;全角ひらがなの場合
		{
		ControlSend,,{Esc},ahk_id %gimp_id%
		Send,{vkF3}
		ControlSend,,t,ahk_id %gimp_id%
		ControlSend,,^r,ahk_id %gimp_id%
		Send,{vkF3} 
		}
	else if (vimestate=0)
		;半角英数の場合
		{
		ControlSend,,{Esc},ahk_id %gimp_id%
		ControlSend,,t,ahk_id %gimp_id%
		ControlSend,,^r,ahk_id %gimp_id%
		Send,{vkF3}
		}
	WinActivate,ahk_id %gimp_id%
	return

IMEGetstate:
	SetTitleMatchMode, 2
	WinGet, vcurrentwindow,, – GIMP
	vimestate := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint", vcurrentwindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
	return

つ、つかれた・・・。