φ(.. ) 備忘録
   
  
ラベル AutoHotKey の投稿を表示しています。 すべての投稿を表示
ラベル AutoHotKey の投稿を表示しています。 すべての投稿を表示

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() ; 制御ウィンドウ連想配列
;===================================================================
; マウスポジションのモニタを取得する
;===================================================================
MyGetMonitor(){
  CoordMode "Mouse", "Screen"
  MouseGetPos &x, &y
  MonitorCount := MonitorGetCount()
  Loop MonitorCount
  {
    MonitorGetWorkArea(A_Index, &MonitorWorkAreaLeft, &MonitorWorkAreaTop, &MonitorWorkAreaRight, &MonitorWorkAreaBottom)
    if(x >= MonitorWorkAreaLeft AND x <= 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 := MyGetMonitor()
  if(String = ""){
      return
  }
  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のショートカットをスタートアップに登録しましょう。

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にしてください。



2014年2月13日木曜日

fvwmユーザのためのAutoHotKey入門

私が入社した頃はSunOSでウィンドウマネージャーはfvwm、エディタはNEmacsというが主流であった。そのせいかWindowsをメインに使用する現在においても当時の癖が抜けず試行錯誤しながらWindowsのカスタマイズを行っている。
そのカスタマイズに最適なツールがAutoHotKeyである。
このツールはショートカットキーを自由にカスタマイズできることに加え、シャットダウンや再起動などの動作も任意のショーカットキーに割り当てることが可能で大変便利である。
ただ、カスタマイズはスクリプトライクなプログラミングが必要であり、初心者にはちょっとハードルが高いかも・・・・。ネットに転がっているスクリプトをコピペして書き換えるのが一番ラクかも。
ということでまずは、fvwmのときにつかっていたキーボードでウィンドウサイズを拡縮する機能を実装してみる。意外と簡単だった。スクリプトは以下。
#NoEnv
;============================================
;ウィンドウサイズ制御
;コンフィグ
MAX_H=1051
MAX_W=1920
^+i::
WinGet,id,ID,A
if(x%id%= ""){
WinGetPos,x%id%,y%id%,w%id%,h%id%,A
WinMove,ahk_id %id%,,x%id%,0,w%id%,MAX_H
}
Else{
WinMove,ahk_id %id%,,x%id%,y%id%,w%id%,h%id%
x%id%=
y%id%=
w%id%=
y%id%=
}
return
^+k::
WinGet,id,ID,A
if(x%id%= ""){
WinGetPos,x%id%,y%id%,w%id%,h%id%,A
WinMove,ahk_id %id%,,0,y%id%,MAX_W,h%id%
}
Else{
WinMove,ahk_id %id%,,x%id%,y%id%,w%id%,h%id%
x%id%=
y%id%=
w%id%=
y%id%=
}
return
^+j::
WinGet,id,ID,A
if(x%id%= ""){
WinGetPos,x%id%,y%id%,w%id%,h%id%,A
WinMove,ahk_id %id%,,0,0,MAX_W,MAX_H
}
Else{
WinMove,ahk_id %id%,,x%id%,y%id%,w%id%,h%id%
x%id%=
y%id%=
w%id%=
y%id%=
}
return
Ctrl + Shift + i で縦拡大、Ctrl + Shift + k で横拡大、Ctrl + Shift + j で全画面にでき、拡大状態でいずれかのショートカットキーを入力すると元に戻る。
みなさんも活用してみてはw

ウィンドウマネージャ徹底解説 fvwm―Fvwm/Fvwn95
江面 敦
テクノプレス
売り上げランキング: 1,224,284

2014年2月1日土曜日

Vistaパソコンをメディアセンターで利活用

以前、録画パソコンとして活躍していたAcer Aspire L5100ですが、自作の低消費電力PCに活躍の場を奪われ、お蔵入り状態であった。冬休み暇だったので、メディアセンターとして再生をこころみた。結構苦労したので、備忘録として残す。
まず、メディアセンターとして使うにはリモコンが必要。ということで、

BUFFALO パソコン用地デジチューナー専用リモコン DT-OP-RC
バッファロー (2008-12-10)
売り上げランキング: 5,354
↑これをケーズデンキの初売りセールで購入(たぶん1980円)。
まず、試したのは、電源ボタンでPCの電源ONができるかどうか。結果ダメでした。
BIOS設定をいろいろいじってみたが、うんともすんとも・・・。まぁ、いいか起動は電源ボタンでw。
次、メディアセンターの操作ができるかどうか。
L5100のVistaにはWindows Media Centerが含まれているのでWMCで試した。
結果、細工がいるが操作はできる。DT-OP-RCのリモコンボタンを押したときに送信されるキーが微妙にWMCのショートカットキーと異なるので、変換が必要となる。以下を買えばそんなことないとおもうが、なにせWMC用リモコンは高いから・・・

I-O DATA Windows Media Center専用リモコン GV-MC7/RCKIT
アイ・オー・データ (2009-10-20)
売り上げランキング: 15,126
キーの変換には、AutoHotKeyを使った。インストールはzipをダウンロードして適当な場所に解凍してショートカットをつくり、スタートアップに入れる。タスクバーの「H」を右クリックして「Edit This Script」を選択し、以下の内容に書き換え後、「Reload This Script」するだけ。
;Windows Media CenterをDT-OP-RCで使う
#IfWinActive, ahk_class eHome Render Window
{
Escape:: ;リモコン戻る
send, {BS}
return
^s:: ;リモコン停止
send, ^+s
return
^v:: ;リモコンメニュー
send, ^+m
return
^+m:: ;リモコンスキップ(次のチャプター)
send, ^f
return
^+n:: ;リモコンスキップ(前のチャプター)
send, ^b
return
^+l:: ;リモコン音声切換
send, ^+a
return
^!w:: ;リモコン表示切替
send, !{Enter}
return
}
上記でWMCは、ほぼリモコンで操作できるようになる。ただし、vista付属のWMPはそのままだとDVDはみれない。コーディックやらスプリッターやらいろいろ追加しないといけないし、youtubeとかみるアドオンもメンテがとまっていて見れない。すんなりあきらめてXBMCをインストールすることにした。次回はXBMCのインストール編を書く。