エクスプローラキーバインド変更 & 持ち運び用キーバインド変更アプリ

参考1:http://d.hatena.ne.jp/morakana/searchdiary?word=Autohotkey&.submit=%B8%A1%BA%F7&type=detail
参考2:http://hp.vector.co.jp/authors/VA023367/neartech/vb/1.html


概要
Autohotokeyを使ってエクスプローラキーバインドを変更
持ち運び用に全設定記述


持ち運び用にShift+SpaceIME切り替えやCapsLockCtrlを追加してまとめた
また,変換+j/kでタスクを切り替え,変換+iEscに設定

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input
;CapsLockをCtrl
sc03a::Ctrl
;Shift+Spaceで半角/全角
+Space::send, {vkF4sc029}
/*
;Launthy用
vk1Dsc07B::#Space
*/
;変換+j/kでタスク切り替え
vk1Csc079 & j::AltTab
vk1Csc079 & k::ShiftAltTab
;変換+iでEsc
vk1Csc079 & i::Send, {Esc}
;Adobe Reader用設定
#IfWinActive ahk_class AcrobatSDIWindow
	j::Down
	J::PgDn
	k::Up
	K::PgUp
	h::^PgUp
	l::^PgDn
	g up::
		if(A_PriorHotkey = A_ThisHotKey)
			Send, {Home}
		return
	G::End
	sc033::^+F6
	.::^F6
	d::^F4
	z::
		Input, InputChar, C I L1 T2, {Esc}, o,i
		if ErrorLevel=Match
		{
			if InputChar=o
				Send, ^-
			if InputChar=i
				Send, ^`;
		}
		return
	z up::
		if(A_PriorHotkey = A_ThisHotKey)
			Send, ^2
		return
#IfWinActive
;エクスプローラ用設定
#IfWinActive ahk_class ExploreWClass
	j::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {Down}
		else
			send, j
		return
	k::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {Up}
		else
			send, k
		return
	h::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {Left}
		else
			send, h
		return
	l::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {Right}
		else
			send, l
		return
	`;::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {NumpadEnter}
		else
			send, `;
		return
	Space::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {AppsKey}
		else
			send, {Space}
		return
	d::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {Del}
		else
			send, d
		return
	u::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, ^z
		else
			send, u
		return
	r::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, {F5}
		else
			send, r
		return
	f::
		if GetClassNameOnWindow(WinExist("A")) <> "Edit"
			send, !veo
		else
			send, f
		return
	^l::
		send, !d
		return
#IfWinActive

GetClassNameOnWindow(hWindow)
{
	max := VarSetCapacity(s, 256)
	ActiveThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWindow, "UIntP",0)
	if(DllCall("AttachThreadInput", "UInt", DllCall("GetCurrentThreadId"), "UInt", ActiveThreadID, "Int", 1))
	{
		hFocus := DllCall("GetFocus")
		DllCall("GetClassName", "UInt", hFocus, "Str", s, "Int", max)
		DllCall("AttachThreadInput", "UInt", DllCall("GetCurrentThreadId"), "UInt", ActiveThreadID, "Int", 0)
	}else
		s := "Error"
	return s
}

コマンド動作コマンド動作
jd削除
kuやり直し
hr再読み込み
lfフォルダの表示/非表示
;エンターCtrl+lアドレスバーに移動
Spaceマウス右クリック

エクスプローラのフォーカスが入力待ち状態の場合は通常入力
そうでない場合は、上のようにマッピング


最初は参考1を元にIMEのon/offで切り替えるつもりだったが,いちいちIMEをonにしないと通常入力できないので却下
GetFocusでアクティブなコントロールのウィンドウハンドルを取得して,色々しようとしたが取得できなかった
呼び出し元(AutoHotkey)とエクスプローラの入力状態は独立しているので操作出来ないのが原因
解決策としてAttachThreadInput関数を使ってエクスプローラにアタッチすることで取得できた
あとは,GetClassName関数でウィンドウハンドルのクラス名を取得し"Edit"の場合は通常入力するようにする
名前の変更で使われるコントロールもEditらしい
また,GetClassName関数もアタッチした状態じゃないと使えないようだ

スキャンコード
http://www.geocities.jp/makoko1974/scancode.txt
AutoHotkeyを流行らせるページ
http://lukewarm.s101.xrea.com/index.html
msdn-GetWindowThreadProcessId
http://msdn.microsoft.com/ja-jp/library/cc364779.aspx
msdn-AttachThreadInput
http://msdn.microsoft.com/ja-jp/library/cc429027.aspx
msdn-GetCurrentThreadId
http://msdn.microsoft.com/ja-jp/library/cc429114.aspx
msdn-GetFocus
http://msdn.microsoft.com/ja-jp/library/cc364641.aspx
msdn-GetClassName
http://msdn.microsoft.com/ja-jp/library/cc364600.aspx