マウス位置でウィンドウ移動【AutoHotKey】

マウス位置でウィンドウ移動…つまりWinMoverやAltMoveのような動作をAutoHotKeyで行うということです。


Windows 7 x64に移行していってますが、Windows 7 x64ではWinMoverが使えません。
そこでWinMover系のソフトを探してみたところ、AltMoveが一番良さそうでこれを使ってました。
元々は、AltMoveを紹介する予定でした。
MDI対応してるのが良かったのですが、更に細かい子ウィンドウまで対応していて、全コントロールが操作出来てしまい、使い辛い面もありました。
スクロールバーが移動出来ちゃったり、アドレスバーが移動出来ちゃったり(笑)
その面、WinMoverは使い勝手がすごく良くて、基本的には親ウィンドウに対し処理され、MDIのCubaseVisual Basic Editorに対してはそのMDIウィンドウに処理されたので、とても自分には使い勝手が良かったです。しかも安定的でした。


そんな感じでWindows 7 x64ではAltMoveを使ってましたが、何かエクセルMDIでAltMoveとMouseGesture.ahkとで競合するようで、AutoHotKeyで何とかならないか考えたら何とか出来ました。

;ウィンドウ移動
^!LButton::
	WinGet,hWnd,ID,A
	MouseGetPos,x1,y1
	Loop {
		CoordMode,Mouse,Screen
		MouseGetPos,x2,y2
		WinMove ahk_id %hWnd%,,x2 - x1, y2 - y1
		If GetKeyState("LButton","P") = 0 {
			return
		}
	}
return

;ウィンドウリサイズ
^+LButton::
	WinGet,hWnd,ID,A
	WinGetActiveStats,w_title,w,h,x3,y3
	CoordMode,Mouse,Screen
	MouseGetPos,x1,y1
	Loop {
		MouseGetPos,x2,y2
		WinMove ahk_id %hWnd%,,x3, y3, w - (x1 - x2), h - (y1 - y2)
		If GetKeyState("LButton","P") = 0 {
			return
		}
	}
return


ウィンドウの座標とマウスの座標を取得して、差し引いたりしてWinMoverの動作を再現してます。
動的にWinMove関数に値を入れなければならないため、Loop文を挟みます。
ウィンドウの移動ではCtrl+Alt+左クリックで動作します。
左ボダンを押し上げると解除されます。
つまり、CtrlとAltは初めだけ押下でも可能です。
ウィンドウのリサイズではCtrl+Shift+左クリックで動作して、あとは移動と同じような感じです。


このようなWinMover系のソフトは修飾キーがAltだけのことが多いですが、個人的な事情で、Cubaseの一時的にはさみツールにする動作と被ってしまうので、2つの修飾キーを使用してます。


MDI版はまた今度書きますー


2/8追記:MDIウィンドウ版
http://d.hatena.ne.jp/Shinez/20110208/p1