自宅時間が増え、自宅パソコンをいじる機会が多くなったので、これを機にパソコンの作業環境を整える。
まずは、ウィンドウ操作関連のショートカットの整備する。以前に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にしてください。