φ(.. ) 備忘録
   
  

2021年9月23日木曜日

fvwm風Autohotkeyスクリプト更新!

自宅時間が増え、自宅パソコンをいじる機会が多くなったので、これを機にパソコンの作業環境を整える。

まずは、ウィンドウ操作関連のショートカットの整備する。以前にAutohotkeyのスクリプトを作成してから、かなりの期間がたっており、状況も変わっていると思うので、スクリプトを作りなおしてみた。

スクリプトの内容は以下。

;===================================================================
; アクティブウィンドウのあるモニタを情報を返却する。
;===================================================================
GetCurrentMonitor(x,y,w,h){
  SysGet, MonitorCount, MonitorCount
  Loop, %MonitorCount%
  {
    SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
    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
      }
    }
  }
}
;===================================================================
; fvwm風ウィンドウ制御(マルチモニタ対応)
;===================================================================
^+!i::
^+!k::
^+!j::
^+!Left::
^+!Right::
^+!UP::
^+!DOWN::
  WinGet,id,ID,A
  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(x%id%=""){ ; ウィンドウが操作管理対象外の場合
    x%id% := x
    y%id% := y
    w%id% := w
    h%id% := h
    m%id% := MonitorNum
    Switch A_ThisHotkey
    {
      Case "^+!i": ;縦拡大
        if(x%id%+w%id%/2 < CenterX){ ;左
          WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW/2,MonitorH
        }
        Else{                        ;右
          WinMove,ahk_id %id%,,CenterX,MonitorY+4,MonitorW/2,MonitorH
        }
      Case "^+!k": ;横拡大
        if(y%id%+h%id%/2 < CenterY){ ;上
          WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW,MonitorH/2
        }
        Else{                        ;下
          WinMove,ahk_id %id%,,MonitorX,CenterY+4,MonitorW,MonitorH/2
        }
      Case "^+!j": ;全画面
        WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW,MonitorH
      Case "^+!Left":
        WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW/2,MonitorH
      Case "^+!Right":
        WinMove,ahk_id %id%,,CenterX,MonitorY+4,MonitorW/2,MonitorH
      Case "^+!UP":
        WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW,MonitorH/2
      Case "^+!DOWN":
        WinMove,ahk_id %id%,,MonitorX,CenterY+4,MonitorW,MonitorH/2
    }
  }

  Else{ ;ウィンドウが操作管理対象の場合
    if(A_ThisHotkey = "^+!i" or A_ThisHotkey = "^+!k" or A_ThisHotkey = "^+!j"){
      if(MonitorNum != m%id%){ ; モニタ番号が変わった
        x%id% := x
        y%id% := y
        w%id% := w
        h%id% := h
        m%id% := MonitorNum
        Switch A_ThisHotkey
        {
          Case "^+!i": ;縦拡大
            if(x%id%+w%id%/2 < CenterX){ ;左
          WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW/2,MonitorH
        }
        Else{                        ;右
          WinMove,ahk_id %id%,,CenterX,MonitorY+4,MonitorW/2,MonitorH
            }
          Case "^+!k": ;横拡大
            if(y%id%+h%id%/2 < CenterY){ ;上
              WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW,MonitorH/2
            }
            Else{                        ;下
              WinMove,ahk_id %id%,,MonitorX,CenterY+4,MonitorW,MonitorH/2
            }
          Case "^+!j":                   ;全画面
            WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW,MonitorH
        }
      }
      Else{ ; モニタ番号が同じ
        ;元のポジションに戻してウィンドウを忘れる
        WinMove,ahk_id %id%,,x%id%,y%id%,w%id%,h%id%
        x%id%=
        y%id%=
        w%id%=
        y%id%=
        m%id%=
      }
    }
    Else{ ; 方向キーの場合
      Switch A_ThisHotkey
      {
        Case "^+!Left":
          WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW/2,MonitorH
        Case "^+!Right":
          WinMove,ahk_id %id%,,CenterX,MonitorY+4,MonitorW/2,MonitorH
        Case "^+!UP":
          WinMove,ahk_id %id%,,MonitorX,MonitorY+4,MonitorW,MonitorH/2
        Case "^+!DOWN":
          WinMove,ahk_id %id%,,MonitorX,CenterY+4,MonitorW,MonitorH/2
      }
    }
  }
  return
;拡張デスクトップの切り替え
^Left::#^Left
^Right::#^Right
^Up::#^Left
^Down::#^Right

以前のスクリプトでは画面サイズをハードコーディングしていたが、自動取得するAPIを発見したため、それに変更してみた。
あと、ウィンドウの移動とサイズ変更方法をWindowsの「Winキー+矢印」っぽくしてみた。使用方法は以下。

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+↓仮想デスクトップ切り替え右


拡大中のウィンドウ選択時に特定のショートカットを入力すると元のサイズと位置に戻る。
あと、拡張デスクトップの切り替えをCtrl+矢印でできようにホットキーを変更している。
マルチモニターには一応対応させてつもり。誤動作するかもしれません。ご注意を。スクリプトの文字コードはUTF-8にしてください。



0 件のコメント :

コメントを投稿