AutoHotKeyで「音量ミキサー」を呼び出して最大化してみた。

 WindowsVista以降、アプリケーションごとに音量を指定できるようになり、それにあわせてボリュームコントロールも「音量ミキサー」として生まれ変わったのだが、これが実に使いにくい。開いた直後は3つのアプリケーションしか表示できない程度の大きさで、しかもウィンドウを広げても記憶しない。

 まあ要するにウィンドウサイズいじるのを自動化すればいいだけなので、AHKでやってみた。

#V::
  run, SndVol.exe
  winWait, 音量ミキサー, , 10
  if (1 == errorLevel)
    return
  winGetPos, , , , WH
  winMove, , , 0, A_ScreenHeight - WH, A_ScreenWidth
return

 スクリプト呼び出すなり、ホットキー割り当てるなり、適当に。

 話は変わるが、音量ミキサーの最大の問題は、ボリューム指定の方法。ボリュームには大きく分けて音声デバイスのボリュームと、アプリケーション毎のボリュームがあって、例えばデバイスを増減させた時はアプリケーションの方は割合で増減する(デバイスを100→50にした時、appAは100→50、appBは50→25)。一方、アプリケーションをデバイスより上げると、デバイスも一緒に上がるが、ほかのアプリケーションのボリュームはそのまま。なにこれ。
 こんなややこしい挙動にするなら、アプリケーションのボリュームの方は最初から「現状の音量に対する割合」にすればよかったのに。


[PR]
by lordnoesis | 2012-01-31 17:57 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Operaのセッションをブックマークに書き込んでみた。

 Operaのセッションを解析してブックマークに書き込むスクリプト。bookmarks.adrの仕様が不明瞭だったので、とりあえずテキストに書き出したのが前回。だがつい先日、実は最低限必要なのはNAMEとURLだけ(他はOperaの起動時に補完される)と知り、さっそくやってみた。

 以下のスクリプトを適当に保存し、"bookmarks.adr"のフルパスを書き込んだら準備完了。あとはセッションファイルを引数にして呼び出す(ドロップ可。複数ファイル対応)と、ブックマークに変換される。その後、Operaを起動すると数秒ののち、"[Session] セッションファイル名"というフォルダにセッションの内容が!

 ちょっといじって、スクリプト冒頭で挙動設定を可能にしてみた。デフォルトだと「タブ履歴無視」「プレーンテキストで保存」なので、いじってみるよろし。bookmarks.adrの指定も忘れないように。

; -------- --------- --------- --------- ---------
; OperaSession2Bookmarks.ahk
; -------- --------- --------- --------- ---------
  BookmarksPath := "C:\Program Files\Opera Next\profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。
  HisSW := 0  ; タブの履歴(そのタブで表示したページの履歴)をどうするかの設定。 0:最後に表示したアドレスのみ読み込む。 1:すべて読み込む。
  WriteSW := 0  ; 書き込み先の設定。 0:セッションと同じ位置にプレーンテキストで保存。 1:bookmarks.adrに書き込む。

  If (1 == WriteSW) {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, %BookmarksPath%が見つかりません。
      Exit
    }
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%
  }

  Loop, %0%
  {
    CmdLineBuf := %A_Index%
    Loop %CmdLineBuf%, 1
      CmdLine := A_LoopFileLongPath
    FileRead, OSession, *P65001 *t %CmdLine%
    If (ErrorLevel) {
      MsgBox, Session File Read Error
      Exit
    }

    SplitPath, CmdLine, , , , SessionName
    Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
    Header := Result
    Idx := 0

    Loop
    {
      Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, idx + 1)
      If (0 == Idx)
        Break
      WinNum := $1
      HisNum := $2 - 1
      StringLen, HisNumLen, HisNum

      RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
      HisTitle := $1
      RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
      HisUrl := $1

      If (0 == HisSW) {  ; タブ履歴を無視する場合
        Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
        Continue
      }

      If (0 == HisNum) {
        Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
        Continue
      }

      Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"

      Loop, %HisNum%
      {
        HisNum--
        RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
        HisTitle := $1
        RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
        HisUrl := $1
        Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
      }
      Result .= "-`n`n"
    }

    If (Header == Result)
      Continue
    Result .= "-`n`n"

    If (1 == WriteSW) {
      FileAppend, %Result%, %BookmarksPath%, CP65001  ; bookmarks.adrに直接書き込む
    } Else {
      FileDelete, %CmdLine%.txt  ; ↓のファイルがすでに存在していたら削除(やらないと追記)
      FileAppend, %Result%, %CmdLine%.txt, CP65001  ; セッションと同じ位置に書き出す
    }
  }
  MsgBox, Finish!
Return

ZeroSupply(Num, Digit){
  StringLen, NumLen, Num
  LoopNum := Digit - NumLen
  Loop, %LoopNum%
    Num := "0" Num
  Return, Num
}

 これで大量のタブを気軽に記録できる。あと、OperaLinkでセッション(だったもの)が共有できる副作用も。
 まさにすべてのOpera-erへの福音(えー。


[PR]
by lordnoesis | 2012-01-10 20:32 | テクノロジ | Trackback | Comments(0)

MouseGesture.ahkでウィンドウ操作メニュー表示してみた。2

 リリース直後に即更新。前回のは実はα版だったんだよ!!! Ω ΩΩ {後付け乙。

 というわけで、ウィンドウ操作メニューを表示するMouseGesture2用スクリプトver.1.0.1。

  • 変更点
    • メニュー呼び出しを「タイトルバー右側のボタンを右クリック」で行うように変更。
    • 操作対象をアクティブウィンドウではなく、右クリックしたウィンドウに変更。
    • 入れ忘れてた最前面固定を追加。

 まず、ソース内のコメントに従い以下のスクリプトを導入。3箇所あるので注意。

; -------- --------- --------- --------- ---------
; 以下を"MG_User.ahk"の初期化処理セクションに追加。
; -------- --------- --------- --------- ---------

MenuId_Max := 0, ItemId := 0, HieLv := 0
MenuId_Cur := "WH" MenuId_Max
Menu, WH0, Add, 最前面, WH_Topmost
Menu, WH0, Add
Loop,Read, WinHack.txt
{
  RegExMatch(A_LoopReadLine, "^\s?([\[\]\;]|----)?\s?([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)", $)
  if(";" == $1)
    Continue
  ItemId++
  if("[" == $1) {
    MenuId_HL%HieLv% := MenuId_Cur
    MenuId_Max++
    MenuId_Cur := "WH" MenuId_Max
    %MenuId_Cur%_Text := $2
    ItemId_HL%HieLv% := ItemId
    ItemId := 0
    HieLv++
    Continue
  }
  if("]" == $1) {
    HieLv--
    MenuId_HLUpp := MenuId_HL%HieLv%
    MenuId_Cur_Text := %MenuId_Cur%_Text
    Menu, %MenuId_HLUpp%, Add, %MenuId_Cur_Text%, :%MenuId_Cur%
    MenuId_Cur := MenuId_HLUpp
    ItemId := ItemId_HL%HieLv%
    Continue
  }
  WM_X%MenuId_Cur%_%ItemId% := $3
  WM_Y%MenuId_Cur%_%ItemId% := $4
  WM_W%MenuId_Cur%_%ItemId% := $5
  WM_H%MenuId_Cur%_%ItemId% := $6
  Menu, %MenuId_Cur%, Add, %$2%, WH_WM
}
Menu, WH0, Add
Menu, WH_WK, Add, 実行, WH_WK
Menu, WH_Etc, Add, 強制終了, :WH_WK
Menu, WH_Etc, Add, プログラムのフォルダを開く(&O), WH_AppDirOpen
Menu, WH_Etc, Add
Menu, WH_Etc, Add, WinHack.txtを開く, WH_SettingOpen
Menu, WH0, Add, その他, :WH_Etc


; -------- --------- --------- --------- ---------
; 以下を"MG_User.ahk"のサブルーチン定義セクションに追加。
; -------- --------- --------- --------- ---------

WH_Show:
  WinGet, state, ExStyle, ahk_id %MG_HWND%
  If ((0x00000008 & state) != 0)
    Menu, WH0, Check, 最前面
  else
    Menu, WH0, UnCheck, 最前面
  Menu, WH0, Show
return

WH_Topmost:
  WinSet, Topmost, TOGGLE, ahk_id %MG_HWND%
return

WH_WM:
  WM_X := WM_X%A_ThisMenu%_%A_ThisMenuItemPos%
  WM_Y := WM_Y%A_ThisMenu%_%A_ThisMenuItemPos%
  WM_W := WM_W%A_ThisMenu%_%A_ThisMenuItemPos%
  WM_H := WM_H%A_ThisMenu%_%A_ThisMenuItemPos%
  WinMove, ahk_id %MG_HWND%, , %WM_X%, %WM_Y%, %WM_W%, %WM_H%
return

WH_WK:
  WinKill, ahk_id %MG_HWND%
return

WH_AppDirOpen:
  wmi := ComObjGet("winmgmts:")
  queryEnum := wmi.ExecQuery(""
    . "Select * from Win32_Process where ProcessId=" . MG_PID)
    ._NewEnum()
  if queryEnum[process] {
    RegExMatch(process.CommandLine, """?([^""]+|[^\s]+)""?", $)
    SplitPath, $1, , AppDir
    Run, explore %AppDir%
  }
  wmi := queryEnum := process := ""
return

WH_SettingOpen:
  Run, WinHack.txt
return


; -------- --------- --------- --------- ---------
; 以下をMouseGesture2にインポート
; -------- --------- --------- --------- ---------

[TitleBarButton]
Custom=MG_HitTest()="MinButton"
Custom=MG_HitTest()="MaxButton"
Custom=MG_HitTest()="CloseButton"

[RB__]
G=RB__
TitleBarButton=GoSub,WH_Show

 [TitleBarButton]、右側ボタンだけだと右側見えてない時に無力なので、「タイトルバーのアイコン」とか「枠」「リサイズ可能な枠」あたりも追加した方がよさげ。ただし「ヘルプボタン」はOperaで誤爆するのでお勧めできない

 次に、"MouseGesture.ahk"と同じ位置に"WinHack.txt"を作成し、ウィンドウ移動・サイズ変更設定を書き込む。書式は以下を参考に。

; -------- --------- --------- --------- ---------
; 書式は以下の通り。
;
; ・"["と"]"でサブメニュー化。ネストも可。
; ・"メニュー項目名, X, Y, Width, Height"でウィンドウ移動・サイズ変更項目を作成可能。
; ・";"で始まる行はコメント行。
; ・上の書式に沿わない行(空改行も含む)はセパレータになる。
; -------- --------- --------- --------- ---------

[移動 (&I)
  基準座標に戻す (&W), 0, 0
  タスクバーを避ける, 165, , ,
  ----
  左656, 0, 0, 656 ,1050
  右1024, 656, 0, 1024 ,1050
  右1024, 656, 0, 1024 ,1050
  ----
  左1024, 0, 0, 1024 ,1050
  右656, 1024, 0, 656 ,1050
]
[リサイズ (&R)
  850*635, , ,850 ,635
  1130*850, , ,1130 ,850
  ----
;  800*600, , ,800 ,600
  1024*768, , ,1024 ,768
  1280*1024, , ,1280 ,1024
]


[PR]
by lordnoesis | 2012-01-10 18:03 | テクノロジ | Trackback | Comments(0)

MouseGesture.ahkでウィンドウ操作メニュー表示してみた。

 Windows7環境で古いmenuHackerがソフトを巻き込んで落ちるので困っていたのだが、よく考えたら独自コマンドの表示さえできればいいのだと気づき、MouseGesture.ahkでそれっぽいものを作ってみた。

 mHの設定ファイルっぽいなにかを読み込むようにしたら、ちょっとばかり複雑化。詳しいことはスクリプト読んでもらうとして、簡単に説明すると「タイトルバーで右クリックすると、本物とは別に独自メニューも隅っこに表示される」というシロモノ。



More
[PR]
by lordnoesis | 2012-01-09 19:00 | テクノロジ | Trackback(1) | Comments(0)
ブログトップ | ファンになる