φ(.. ) 備忘録
   
  

2024年9月17日火曜日

ホットキーでウィンドウ拡大縮小するAutoHotKeyスクリプト

以前、Autohotkeyでのウィンドウ操作スクリプトを公開したが、AutoHotKeyのバージョンアップに伴いスクリプトも新しく更新した。
v1とv2で結構スクリプトの書き方に変更が加わっていて少し苦労した。
使い方はソース上の花文字を参照願う。 AutoHotKeyのバージョンは 2.0.18 を使用した。
ダウンロードは こちら 使い方は以下。
(1)適当なフォルダにダウンロードしたzipを解凍
(2)以下スクリプトをAutoHotkey64.ahkの名前で保存。
    この際、ファイルエンコードはUTF-8で保存すること。
;===================================================================
; fvwm風ウィンドウ操作スクリプト マルチモニタ対応版
;  ※AutoHotkey 2.0.18で動作確認済
;  ショートカット一覧
;    Ctrl+Shift+Alt+i	ウィンドウ縦拡大
;    Ctrl+Shift+Alt+k	ウィンドウ横拡大
;    Ctrl+Shift+Alt+j	ウィンドウ全画面
;    Ctrl+Shift+Alt+←	ウィンドウ左寄せ
;    Ctrl+Shift+Alt+→	ウィンドウ右寄せ
;    Ctrl+Shift+Alt+↑	ウィンドウ上寄せ
;    Ctrl+Shift+Alt+↓	ウィンドウ下寄せ
;    Ctrl+←	仮想デスクトップ切り替え左
;    Ctrl+→	仮想デスクトップ切り替え右
;    Ctrl+↑	仮想デスクトップ切り替え左
;    Ctrl+↓	仮想デスクトップ切り替え右
;===================================================================
MyWin:=Map() ; 制御ウィンドウ連想配列
;===================================================================
; アクティブウィンドウのあるモニタを情報を返却する。
;===================================================================
GetCurrentMonitor(x,y,w,h){
  MonitorCount := MonitorGetCount()
  Loop MonitorCount
  {
    MonitorGetWorkArea(A_Index, &MonitorWorkAreaLeft, &MonitorWorkAreaTop, &MonitorWorkAreaRight, &MonitorWorkAreaBottom)
    if(x+w/2 >= MonitorWorkAreaLeft AND x+w/2 <= MonitorWorkAreaRight){
      if(y >= MonitorWorkAreaTop AND y <= MonitorWorkAreaBottom){
        ;モニタの左上とセンタの座標を求める
        if(MonitorWorkAreaLeft<MonitorWorkAreaRight){
          MonitorW:=MonitorWorkAreaRight-MonitorWorkAreaLeft
          CenterX:=MonitorWorkAreaLeft+(MonitorWorkAreaRight-MonitorWorkAreaLeft)/2
        }
        else{
          MonitorW:=Abs(MonitorWorkAreaLeft)-Abs(MonitorWorkAreaRight)
          CenterX:=MonitorWorkAreaLeft+(Abs(MonitorWorkAreaLeft)-Abs(MonitorWorkAreaRight))/2
        }
        if(MonitorWorkAreaTop<MonitorWorkAreaBottom){
          MonitorH:=MonitorWorkAreaBottom-MonitorWorkAreaTop
          CenterY:=MonitorWorkAreaTop+(MonitorWorkAreaBottom-MonitorWorkAreaTop)/2
        }
        else{
          MonitorH:=Abs(MonitorWorkAreaTop)-Abs(MonitorWorkAreaBottom)
          CenterY:=MonitorWorkAreaTop+(Abs(MonitorWorkAreaTop)-Abs(MonitorWorkAreaBottom))/2
        }
        Return MonitorWorkAreaLeft . " " . MonitorWorkAreaTop . " " . MonitorW . " " . MonitorH . " " . CenterX . " " . CenterY . " " . A_Index
      }
    }
  }
}
;===================================================================
; ウィンドウ管理中判定
;===================================================================
isMyWin(id){
  For key, value in MyWin
    if(key = id){
       return 1 ; 配列有
    }
  return 0 ; 配列無
}
;===================================================================
; メインルーチン
;===================================================================
^+!i::
^+!k::
^+!j::
^+!Left::
^+!Right::
^+!UP::
^+!DOWN::
{
  id := WinGetID("A")
  if(WinGetMinMax("ahk_id" id) = 1){ ; ウィンドウが最大化なら解除する
    WinRestore("ahk_id " id)
  }
  WinGetPos &x, &y, &w, &h, "A"
  String := GetCurrentMonitor(x,y,w,h) ; モニタ情報取得
  Array := StrSplit(String, A_Space)
  MonitorX := Array[1]
  MonitorY := Array[2]
  MonitorW := Array[3]
  MonitorH := Array[4]
  CenterX  := Array[5]
  CenterY  := Array[6]
  MonitorNum := Array[7]
  if(isMyWin(id)=0){ ; ウィンドウが操作管理対象外の場合
    MyWin[id] := {} ; オブジェクト作成
    MyWin[id].x := x
    MyWin[id].y := y
    MyWin[id].w := w
    MyWin[id].h := h
    MyWin[id].m := MonitorNum
    Switch A_ThisHotkey
    {
      Case "^+!i": ;縦拡大
        if(MyWin[id].x+MyWin[id].w/2 < CenterX){ ;左
          WinMove MonitorX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
        }
        Else{                        ;右
          WinMove CenterX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
        }
      Case "^+!k": ;横拡大
        if(MyWin[id].y+MyWin[id].h/2 < CenterY){ ;上
          WinMove MonitorX,MonitorY+4,MonitorW,MonitorH/2,"ahk_id " id
        }
        Else{                        ;下
          WinMove MonitorX,CenterY+4,MonitorW,MonitorH/2,"ahk_id " id
        }
      Case "^+!j": ;全画面
        WinMove MonitorX,MonitorY+4,MonitorW,MonitorH,"ahk_id " id
      Case "^+!Left":
        WinMove MonitorX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
      Case "^+!Right":
        WinMove CenterX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
      Case "^+!UP":
        WinMove MonitorX,MonitorY+4,MonitorW,MonitorH/2,"ahk_id " id
      Case "^+!DOWN":
        WinMove MonitorX,CenterY+4,MonitorW,MonitorH/2,"ahk_id " id
    }
  }
  Else{ ;ウィンドウが操作管理対象の場合
    if(A_ThisHotkey = "^+!i" or A_ThisHotkey = "^+!k" or A_ThisHotkey = "^+!j"){
      if(MonitorNum != MyWin[id].m){ ; モニタ番号が変わった
        MyWin[id].x := x
        MyWin[id].y := y
        MyWin[id].w := w
        MyWin[id].h := h
        MyWin[id].m := MonitorNum
        Switch A_ThisHotkey
        {
          Case "^+!i": ;縦拡大
            if(MyWin[id].x+MyWin[id].w/2 < CenterX){ ;左
          WinMove MonitorX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
        }
        Else{                        ;右
          WinMove CenterX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
            }
          Case "^+!k": ;横拡大
            if(MyWin[id].y+MyWin[id].h/2 < CenterY){ ;上
              WinMove MonitorX,MonitorY+4,MonitorW,MonitorH/2,"ahk_id " id
            }
            Else{                        ;下
              WinMove MonitorX,CenterY+4,MonitorW,MonitorH/2,"ahk_id " id
            }
          Case "^+!j":                   ;全画面
            WinMove MonitorX,MonitorY+4,MonitorW,MonitorH,"ahk_id " id
        }
      }
      Else{ ; モニタ番号が同じ
        ;元のポジションに戻してウィンドウを忘れる
        WinMove MyWin[id].x,MyWin[id].y,MyWin[id].w,MyWin[id].h,"ahk_id " id
	MyWin.Delete(id) ; 連想配列削除
      }
    }
    Else{ ; 方向キーの場合
      Switch A_ThisHotkey
      {
        Case "^+!Left":
          WinMove MonitorX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
        Case "^+!Right":
          WinMove CenterX,MonitorY+4,MonitorW/2,MonitorH,"ahk_id " id
        Case "^+!UP":
          WinMove MonitorX,MonitorY+4,MonitorW,MonitorH/2,"ahk_id " id
        Case "^+!DOWN":
          WinMove MonitorX,CenterY+4,MonitorW,MonitorH/2,"ahk_id " id
      }
    }
  }
  return
}
;拡張デスクトップの切り替え
^Left::#^Left
^Right::#^Right
^Up::#^Left
^Down::#^Right
(3)AutoHotkey64.exeを起動
これでつかえます。常時つかうなら、AutoHotkey64.exeのショートカットをスタートアップに登録しましょう。

0 件のコメント :

コメントを投稿