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)。一方、アプリケーションをデバイスより上げると、デバイスも一緒に上がるが、ほかのアプリケーションのボリュームはそのまま。なにこれ。
こんなややこしい挙動にするなら、アプリケーションのボリュームの方は最初から「現状の音量に対する割合」にすればよかったのに。
AutoHotKey_Lで、Operaのセッションをブックマークに書き込んでみた。
Operaのセッションを解析してブックマークに書き込むスクリプト。bookmarks.adrの仕様が不明瞭だったので、とりあえずテキストに書き出したのが前回。だがつい先日、実は最低限必要なのはNAMEとURLだけ(他はOperaの起動時に補完される)と知り、さっそくやってみた。
以下のスクリプトを適当に保存し、"bookmarks.adr"のフルパスを書き込んだら準備完了。あとはセッションファイルを引数にして呼び出す(ドロップ可。複数ファイル対応)と、ブックマークに変換される。その後、Operaを起動すると数秒ののち、"[Session] セッションファイル名"というフォルダにセッションの内容が!
最初は、スクリプトの下の方のコメントを参考に、ファイル書き出しモードで試してみるとよろし。
; -------- --------- --------- --------- ---------
; OperaSession2Bookmarks.ahk
; -------- --------- --------- --------- ---------
BookmarksPath := "C:\Opera Next\profile\bookmarks.adr" ; bookmarks.adrのフルパスを指定。
IfNotExist, %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, 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 == 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"
FileAppend, %Result%, %BookmarksPath%, CP65001 ; bookmarks.adrに直接書き込む
; 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への福音(えー。
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
]
MouseGesture.ahkでウィンドウ操作メニュー表示してみた。
Windows7環境で古いmenuHackerがソフトを巻き込んで落ちるので困っていたのだが、よく考えたら独自コマンドの表示さえできればいいのだと気づき、MouseGesture.ahkでそれっぽいものを作ってみた。
mHの設定ファイルっぽいなにかを読み込むようにしたら、ちょっとばかり複雑化。詳しいことはスクリプト読んでもらうとして、簡単に説明すると「タイトルバーで右クリックすると、本物とは別に独自メニューも隅っこに表示される」というシロモノ。
More
AutoHotKeyで、画像ビューア(MassiGra)の複数ウィンドウ運用を便利にしてみた。
MassiGraのウィンドウを切り替えたり、並べたりするAHK_Lスクリプト。ANSI版でもたぶん動く。
MassiGraでなくとも応用効くと思う。
MassiGraのキー設定で「現在のファイルを開く : Num.」「前のファイル : 上」「次のファイル : 下」にして、複数の画像を開く運用をしていて、ウィンドウ切り替えが面倒なので書いてみた。
左右キーでウィンドウ切り替え。Ctrl+右でひとつ前のウィンドウを避けて配置。Ctrl+左はリセット(左端に配置)。Esc長押しですべてのMassiGraを閉じる。
;--------------------------------------------------
; MassiGra
;--------------------------------------------------
#WinActivateForce
#IfWinActive ahk_class TF811202_MassiGra_Main
Left::
WinSet,Bottom,, ahk_class TF811202_MassiGra_Main
WinActivate, ahk_class TF811202_MassiGra_Main
return
Right::
WinActivateBottom, ahk_class TF811202_MassiGra_Main
return
$Esc::
KeyWait, Esc, T1
if ErrorLevel
{
GroupAdd, Massigras, ahk_class TF811202_MassiGra_Main
GroupClose, Massigras, A
BefWin_X := 0, BefWin_W := 0, BefWin_XW := 0
} else {
Send, {Esc}
}
KeyWait, Esc
return
^Left::
BefWin_X := 0, BefWin_W := 0, BefWin_XW := 0
^Right::
if (BefWin_XW == NULL)
BefWin_X := 0, BefWin_W := 0, BefWin_XW := 0
WinGetActiveStats, NowWin_T, NowWin_W, NowWin_H, NowWin_X, NowWin_Y
if (BefWin_XW + NowWin_W > A_ScreenWidth) {
if (BefWin_X == 0) {
Move_X := A_ScreenWidth - NowWin_W
} else {
Move_X := 0
if (NowWin_W > BefWin_X) {
if (NowWin_W > (A_ScreenWidth - BefWin_W))
WinMove, ahk_id %BefWin_Hwnd%, , A_ScreenWidth - BefWin_W
else
WinMove, ahk_id %BefWin_Hwnd%, , NowWin_W
}
}
} else {
Move_X := BefWin_XW
}
BefWin_Hwnd := WinActive(A)
BefWin_X := Move_X
BefWin_W := NowWin_W
BefWin_XW := BefWin_X + BefWin_W
WinMove, Move_X
WinActivateBottom, ahk_class TF811202_MassiGra_Main
return
ウィンドウ配置はYも考慮するとややこしくなるので妥協。
使いやすいタブ対応画像ビューアさえあれば……。
AutoHotKey_Lで、Operaのセッションをテキストに書きだしてみた。
OperaのセッションファイルからURLとタイトルを抽出してプレーンテキストにするスクリプト。
セッション溜め過ぎたので整理しようと思ったのだが、Operaでは確認も編集もできないという……。でもきっと世界の誰かが補助ツール作ってるに違いない!と思ったのだが見当たらず。なぜだ。Donutにすらお気に入りグループ編集ツールがあるというのに……。
使い方は、セッションファイル(.win)のパスを引数にしてスクリプトを呼び出すだけ(スクリプトにドロップで可)。あとは勝手にセッションと同じ位置にテキストファイルが作られる。
loop, %0%
{
CmdLineBuf := %A_Index%
Loop %CmdLineBuf%, 1
CmdLine := A_LoopFileLongPath
FileRead, OSession, *P65001 *t %CmdLine%
if (ErrorLevel)
{
msgbox, File Read Error
Exit
}
WinNum := 2
result :=
loop
{
idx := RegExMatch(OSession, "\[" WinNum "history url\].+?count=(.*?)\n", $)
if (0 == idx)
break
HisNum := $1 - 1
RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
HisTitle := $1
RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
HisUrl := $1
Result = %Result%%HisTitle%`n%HisUrl%`n
loop, %HisNum%
{
HisNum--
RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
HisTitle := $1
RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
HisUrl := $1
Result = %Result% %HisTitle%`n %HisUrl%`n
}
Result = %Result%`n`n
WinNum++
}
if (""==Result)
Continue
FileDelete, %CmdLine%.txt
FileAppend, %Result%, %CmdLine%.txt
}
今回使った正規表現を移植すればAutoHotKey_Lで、Operaの前回セッションを確認・退避できるようにしてみた。2のスクリプトもUTF-8対応になるが、別に困ってないのでいいやっていう。
.jpg)
