↑の続編的な。
まだ開発中。
動機
- MagnetWindowを使っていたが、Chromeに対して機能しなかった
- ウィンドウ同士は適当に重ねる派なので、とりあえず画面端にだけピタっとしてくれ
実装
ドラッグ移動の判定
とりあえず、単純にマウス左ボタンを長押しした場合とする。
本当はウィンドウ移動の有無も判定したほうがいいけど。
; ウィンドウドラッグ時にはみ出していたら端寄せ
~LButton::Return ; A_TimeSincePriorHotkeyを取るためだけ
LButton up::
; 修飾キー付きを排除
; クリックを排除
If (A_PriorHotKey = "~LButton" and A_TimeSincePriorHotkey > 300)
{
SnapWindow()
}
Return
; ウィンドウがはみ出していたら端寄せする関数
; 現状、タスクバーが下にある場合のみ対応
SnapWindow()
{
WinGetPos, , , , tbHeight, ahk_class Shell_TrayWnd ; タスクバーの高さ取得
WinGetPos, VarX, VarY, AW, AH, A
If (VarY < 0)
DestY = 0
Else If (VarY > (A_ScreenHeight - tbHeight - AH))
DestY := A_ScreenHeight - AH - tbHeight + 2 ; ちょい浮くので 2 下に調整
If (VarX < 0)
DestX = 0
Else If ((VarX + AW) > A_ScreenWidth)
DestX := (A_ScreenWidth - AW)
WinMove, A, , %DestX%, %DestY%
}
ドラッグ移動で発動ということは、離したタイミングで発動なので、Upホットキーということになる。
長押し判定は、A_TimeSincePriorHotkey
がnミリ秒以上という形で行うことができる。
A_TimeSincePriorHotkey
は、A_PriorHotkey
(直近で発動したホットキー、ホットキーラベル内では「今回のそれ自体」は除く)からの経過時間が格納される組み込み変数。
左ボタンのUpホットキーなので、A_PriorHotkey
が左ボタンの押下であり、かつA_TimeSincePriorHotkey
がある程度長ければ、左ボタンの長押しだと判断できる。
(厳密には、その間にカーソルが一定以上の距離を移動しているかも評価したほうがよいが、とりあえず省く)
ここで困るのが、A_PriorKey
(直近で入力されたキー)からの経過時間が格納される組み込み変数はないということ。
つまり、左ボタン押下がホットキーとしてスクリプトに登録されていなければ、ホールド時間の取りようがないということになる。
よって、~LButton::Return
が必要になるというわけ。
別に*LButton::Send, {Blind}{LButton}
とかでもいいっちゃいいのだが、チルダで入力を通す場合、他のLButton
を使うホットキーラベルと共存できるのがメリットとなる。