その買うを、もっとハッピーに。|ハピタス

MouseGesture.ahkでエクスプローラーをコピー

Windows 7に移行するにあたって、とりあえずは窓使いの憂鬱の代用でAutoHotKeyを使うようにしてます。
それで今更ながらMouseGesture.ahkを試してみましたが、とても便利ですね。
今までXPで使ってたHandyGesturesの代用として考えてみて、「戻る」や「進む」は「Send,!{Left}」とかやって割と簡単にアクションを組めますが、右クリック+下のウィンドウのコピーをどうしようかなと思い、色々試行錯誤してみました。
一つプログラムを知ってると、概念が似てるからか多少は入りやすいですね。
まだまだノリな部分が多いですが(笑)

if (A_OSVersion == "WIN_VISTA"){
	WinGetText w_text
	StringGetPos pos1, w_text, %A_Space%
	StringGetPos pos2, w_text, `n
	StringMid path, w_text, pos1 + 2, pos2 - pos1 - 2
	FileGetAttrib att, %path%
	if (att == ""){
		if (path == "コンピューター"){
			path := "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
		} else if (path == "ネットワーク") {
			path := "::{208D2C60-3AEA-1069-A2D7-08002B30309D}"
		} else if (path == "ごみ箱") {
			path := "::{645FF040-5081-101B-9F08-00AA002F954E}"
		} else if (path == "ライブラリ\ドキュメント") {
			path := "::{450D8FBA-AD25-11D0-98A8-0800361B1103}"
		} else if (path == "すべてのコントロール パネル項目") {
			path := "::{21EC2020-3AEA-1069-A2DD-08002B30309D}"
		} else if (path == "プリンター") {
			path := "::{2227A280-3AEA-1069-A2DE-08002B30309D}"
		} else if (path == "ライブラリ") {
			path := "::{031E4825-7B94-4dc3-B131-E946B44C8DD5}"
		} else if (path == "ホームグループ") {
			path := "::{B4FB3F98-C1EA-428d-A78A-D1F5659CBA93}"
		} else if (path == "デスクトップ") {
			path := "shell:Desktop"
		} else if (path == "ライブラリ\ピクチャ") {
			path := "shell:My Pictures"
		} else if (path == "ライブラリ\ビデオ") {
			path := "shell:My Video"
		} else if (path == "ライブラリ\ミュージック") {
			path := "shell:My Music"
		} else {
			;上記以外はマイコンで…(´Д`)
			path := "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
		}
	}
	Run explorer %path%
} else {
	msgbox, これから作成します(´Д`)
}

スクリプトについて


全然スマートじゃないですが(笑)
もっと良い方法はあるのかもしれません(´Д`)


エクスプローラーのウィンドウをコピーするにあたって、コマンドでエクスプローラーにパスを渡して開くということしか思い浮かばなかったので、そのパスがどうにか取得出来ないものかと思って調べたり試しましたが、組み込み関数のWinGetTextに情報が入ってましたので、そこから取得することに。
ただ、このパスはアドレスバーのパスなので、特殊なフォルダの場合、コマンドで引数として渡しても無効な時があります。
ですのでIf文で、可能な限り引数として渡しても大丈夫な形に変換してます(笑)
全部やるのは大変なので、一部ですが。
やっぱりこのやり方じゃしっくりしませんね(笑)


WinGetTextからパスの抽出は、文字位置を足したり引いたりする手法でやってますが、VBのInStrやMidにあたる組み込み関数があって良かったです。
あとSelect Caseもあると良かったな。
else ifばっかだから(笑)
色々探してみた感じでは、ありませんでした。


最後のelseの部分でこれから作成となってるのは、XP用です。
XPだと取得情報がちょっと違うので、少し改変しないといけません。

MouseGesture.ahkの仕様?


※2/3追記:解決しましたー
http://d.hatena.ne.jp/Shinez/20110203/p1


MouseGesture.ahkの仕様なのかわかりませんが、Operaなどのマウスジェスチャーの場合、一番最後にボタンを離した瞬間に処理が実行されます。
しかしMouseGesture.ahkの場合は違うようで、ボタンから離れる前に判定をしてしまいます。
例えば下→右というアクションを起こしたい場合、下、だけのアクションが登録されていると、下→右というようには認識せず、下、になってしまいます。
回避策があるのか分かりませんが、もうちょっと色々調べたり試したりしてみます。