縦or横にのみ最大化/元に戻す

縦or横にのみ最大化/元に戻す

TTBaseTMaxという縦方向のみ最大化するプラグインを使っていたけど、AutoHotkeyでできることはAutoHotkeyでやろうと思って作った。作るついでに横方向も実現。あまり使わないけども。

以下スクリプト。Shift+F11で縦に最大化、Ctrl+F11で横に最大化。もう一度キーを押すと元の位置・サイズに戻る。ただ最大化するんじゃなく、元の位置・サイズに戻せるようにしたかったので、hwmax.iniというファイルを作ってそこに記憶することにした。

;一方向に最大化
;;縦方向
+F11::
  WinGetClass, Class, A
  WinGetPos, , Y, W, H, A
  WinGet, Maximized, MinMax, A
  SysGet, WorkArea, MonitorWorkArea
  If (Maximized = 1) {
    Return
  }
  Else If (H != WorkAreaBottom) {
    IniWrite, %H%, hwmax.ini, %Class%, h
    IniWrite, %Y%, hwmax.ini, %Class%, y
    WinMove, A, , , 0, , %WorkAreaBottom%
  } Else {
    IniRead, LastH, hwmax.ini, %Class%, h
    Iniread, LastY, hwmax.ini, %Class%, y
    If (LastH != "ERROR") {
      WinMove, A, , , LastY, , %LastH%
    }
  }
Return
;;横方向
^F11::
  WinGetClass, Class, A
  WinGetPos, X, , W, H, A
  WinGet, Maximized, MinMax, A
  SysGet, WorkArea, MonitorWorkArea
  If (Maximized = 1) {
    Return
  }
  Else 
  If (W != WorkAreaRight) {
    IniWrite, %W%, hwmax.ini, %Class%, w
    IniWrite, %X%, hwmax.ini, %Class%, x
    WinMove, A, , 0, , %WorkAreaRight%
  } Else {
    Iniread, LastW, hwmax.ini, %Class%, w
    Iniread, LastX, hwmax.ini, %Class%, x
    If (LastW != "ERROR") {
      WinMove, A, , LastX, , %LastW%
    }
  }
Return

一応やっていることを説明すると、以下のようになる。

  1. アクティブウィンドウのクラス名、サイズ、位置を取得
  2. 作業領域(画面の大きさからタスクバー分引いたもの)のサイズを取得
  3. 最大サイズでなければクラス名、サイズ、位置をhwmax.iniに記憶し、一方向最大化
  4. 既に最大サイズならば、hwmax.iniからアクティブウィンドウと同じクラス名のサイズ、位置情報を読み込む
  5. 情報が見つかればそれに従ってリサイズ

情報をクラス名でまとめているので、同じソフトでクラス名が同一のウィンドウを複数開いている場合、情報が上書きされて別々には動作させられない。もっとも、ブラウザもタブ化が標準化しているし、それで困ることはあんまり無いと思うが。

追記(2010/03/06)

(普通の)最大化状態で実行すると、ウィンドウ枠が消える分サイズが変化して挙動が変になるので、最大化状態の時には何もせず終了するようにした。