人気ブログランキング | 話題のタグを見る

AutoHotKey_Lで、音量ミキサーを少し便利に。

 WindowsVista以降では、ソフトウェアごとに音量調整が可能になったが、標準の音量ミキサーはマウスだと加減しにくく、キーボード操作も微妙なのでAHK書いた。たぶんVista以降対応だと思うがWin7でしか確認してない。

 #v打鍵で画面幅いっぱいに音量ミキサー呼び出し。上下、PageUp/Down、Home/Endキーで音量調整。ソフトウェアごとの音量は、左端のマスターボリュームの値が上限となるよう制限。左右キーで対象ソフトウェア変更。ツールチップとタイトルバーで音量の概略を表示。

; 音量ミキサー最大化呼び出し
#V::
Run, SndVol.exe, , , svpid
winWait, 音量ミキサー, , 10
if errorLevel
return
WinGetPos, , , , WH
WinMove, , , 0, A_ScreenHeight - WH, A_ScreenWidth
return


;--------------------------------------------------------------------------------------
; 音量ミキサー
;--------------------------------------------------------------------------------------
#IfWinActive 音量ミキサー ahk_class #32770

Up::
ControlGetFocus, ACtrl
IfInString, ACtrl, msctls_trackbar32
AVolLvUD(1)
else
Send, {Up}
return

Down::
ControlGetFocus, ACtrl
IfInString, ACtrl, msctls_trackbar32
AVolLvUD(0)
else
Send, {Down}
return

PGUP::AVolLvUD(1, 20)
PGDN::AVolLvUD(0, 20)

Home::AVolLvUD(1, 100)
End::AVolLvUD(0, 100)

Right::VolFocusMove(1)
Left::VolFocusMove(0)

AVolLvUD(Direct = 1, MP = 1) {
ControlGetFocus, AVolCNN
IfNotInString, AVolCNN, msctls_trackbar32
return

MVolCNN := "msctls_trackbar32" GetMVolNN()

SendMessage, 0x400, , , %AVolCNN% ; TBM_GETPOS
AVolNum := ErrorLevel

if (AVolCNN != MVolCNN) {
SendMessage, 0x400, , , %MVolCNN% ; TBM_GETPOS
MVolNum := ErrorLevel
} else
MVolNum := 0

if Direct {
if (AVolNum - MP > MVolNum)
SetVolLv(AVolCNN, AVolNum - MP)
else ; MVolより音量が大きくなる場合
SetVolLv(AVolCNN, MVolNum)
} else {
SetVolLv(AVolCNN, AVolNum + MP)
}

VolLvView(AVolCNN, MVolCNN)
return
}

SetVolLv(AVolCNN, VolNum) {
ControlGet, AVolHwnd, Hwnd, , %AVolCNN%
SendMessage, 0x405, 0x1, %VolNum%, %AVolCNN% ; TBM_SETPOS

ParCNN := "#32770" RegExReplace(AVolCNN, "^msctls_trackbar32(\d+)$", "$1")
ControlGet, ParHwnd, Hwnd, , %ParCNN%
if ParHwnd
SendMessage, 0x115, 0x4,%AVolHwnd%, , ahk_id %ParHwnd% ; WM_VSCROLL
else
SendMessage, 0x115, 0x4,%AVolHwnd% ; WM_VSCROLL
}

VolFocusMove(Direct = 1) {
MVolNN := GetMVolNN()

ControlGetFocus, AVolCNN
if !RegExMatch(AVolCNN, "^(msctls_trackbar32|ToolbarWindow32)(\d+)$", $) {
ControlFocus, msctls_trackbar32%MVolNN%
return
}
if ("msctls_trackbar32" == $1)
AVolNN := $2
else
AVolNN := $2 // 2

if Direct {
if (MVolNN == AVolNN++)
TrgVolCNN := "msctls_trackbar321"
else
TrgVolCNN := "msctls_trackbar32" AVolNN
} else {
if (1 == AVolNN--)
TrgVolCNN := "msctls_trackbar32" MVolNN
else
TrgVolCNN := "msctls_trackbar32" AVolNN
}
ControlFocus, %TrgVolCNN%

VolLvView(TrgVolCNN, "msctls_trackbar32" MVolNN)
}

GetMVolNN() {
WinGet, CList, ControlList, 音量ミキサー ahk_class #32770
MVolNN := 0
Loop, Parse, CList, `n
if RegExMatch(A_LoopField, "^msctls_trackbar32(\d+)$", $)
if (MVolNN < $1)
MVolNN := $1
return MVolNN
}

VolLvView(AVolCNN, MVolCNN) {
SendMessage 0x400, , , %AVolCNN% ; TBM_GETPOS
AVolNum := ErrorLevel
AVolLv := 100 - AVolNum
SendMessage 0x400, , , %MVolCNN% ; TBM_GETPOS
MVolLv := 100 - ErrorLevel

WinGetTitle, AWTitle
TitleBuf := RegExReplace(AWTitle, "(.*?) Vol:[\d/ ]+?$", "$1") " Vol:" MVolLv

LoopCnt := RegExReplace(MVolCNN, "^msctls_trackbar32(\d+)$", "$1") - 1
Loop, %LoopCnt% {
SendMessage, 0x400, , , msctls_trackbar32%A_Index% ; TBM_GETPOS
TitleBuf .= " / " 100 - ErrorLevel
}
WinSetTitle, %TitleBuf%

ControlGetPos, CX, CY, , CH, %AVolCNN%
TY := CY + (CH - 24) / 100 * AVolNum - 24
ToolTip, Vol:%AVolLv% / %MVolLv%, %CX%, %TY%, 10 ; ToolTip番号は適当に

SetTimer, VolLvCheck, 100
}

VolLvCheck:
IfWinNotActive, 音量ミキサー ahk_class #32770
ToolTip, , , , 10 ; ToolTip番号は適当に
IfWinNotExist, 音量ミキサー ahk_class #32770
SetTimer, VolLvCheck, Off
return

 以前も書いたが、音量ミキサーのソフトウェアごとの音量は絶対値でなく、マスターボリュームに対する割合にした方がいいと思ってるのだが、ひとまず満足したんでやめた。

 正直、ソフトウェア側でなくOS側で音量いじることってあまりないが、まあAHKでトラックバー(スライドバー)いじる練習になったからいいかな……。

AutoHotKey_Lで、音量ミキサーを少し便利に。_c0031643_20503090.png

TODO:実用上問題ないが、微妙なところがあるので機能強化のついでに直す。来週。直した


by lordnoesis | 2013-12-06 20:43 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる