processName := "chrome.exe"
PIDs := EnumProcessesByName(processName)
mute := 0
for k, v in PIDs
SetAppVolume(v, volume := 100)
Return
!Space::
mute := !mute
for k, v in PIDs
SetAppVolume(v, mute ? "mute" : "unmute")
Return
!Home::
!End::
volume += A_ThisHotkey = "!End" ? -3 : 3
volume := volume < 0 ? 0 : volume > 100 ? 100 : volume
for k, v in PIDs
SetAppVolume(v, volume)
Return
EnumProcessesByName(searchName, regEx := false) {
if !DllCall("Wtsapi32\WTSEnumerateProcesses", "Ptr", 0, "UInt", 0, "UInt", 1, "PtrP", pProcessInfo, "PtrP", count)
throw Exception("WTSEnumerateProcesses failed. A_LastError: " . A_LastError)
addr := pProcessInfo, PIDs := []
Loop % count {
procName := StrGet( NumGet(addr + 8) )
if ( regEx && RegExMatch(procName, searchName) ) || (procName = searchName)
PID := NumGet(addr + 4, "UInt"), PIDs.Push(PID)
addr += 8 + A_PtrSize*2
}
DllCall("Wtsapi32\WTSFreeMemory", "Ptr", pProcessInfo)
Return PIDs
}
SetAppVolume(PID, volume) ; WIN_V+
{
static MMDeviceEnumerator := "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
, IID_IMMDeviceEnumerator := "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
, IID_IAudioSessionManager2 := "{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
, IID_IAudioSessionControl2 := "{BFB7FF88-7239-4FC9-8FA2-07C950BE9C6D}"
, IID_ISimpleAudioVolume := "{87CE5498-68D6-44E5-9215-6DA47EF883D8}"
, eRender := 0, eMultimedia := 1, CLSCTX_ALL := 0x17
if (volume + 0 != "")
volume := volume > 100 ? 100 : volume < 0 ? 0 : volume
IMMDeviceEnumerator := ComObjCreate(MMDeviceEnumerator, IID_IMMDeviceEnumerator)
; IMMDeviceEnumerator::GetDefaultAudioEndpoint
DllCall(NumGet(NumGet(IMMDeviceEnumerator+0)+4*A_PtrSize), "Ptr", IMMDeviceEnumerator, "UInt", eRender, "UInt", eMultimedia, "PtrP", IMMDevice)
ObjRelease(IMMDeviceEnumerator)
VarSetCapacity(GUID, 16)
DllCall("Ole32.dll\CLSIDFromString", "Str", IID_IAudioSessionManager2, "Ptr", &GUID)
; IMMDevice::Activate
DllCall(NumGet(NumGet(IMMDevice+0)+3*A_PtrSize), "Ptr", IMMDevice, "Ptr", &GUID, "UInt", CLSCTX_ALL, "Ptr", 0, "PtrP", IAudioSessionManager2)
ObjRelease(IMMDevice)
; IAudioSessionManager2::GetSessionEnumerator
DllCall(NumGet(NumGet(IAudioSessionManager2+0)+5*A_PtrSize), "Ptr", IAudioSessionManager2, "PtrP", IAudioSessionEnumerator)
ObjRelease(IAudioSessionManager2)
; IAudioSessionEnumerator::GetCount
DllCall(NumGet(NumGet(IAudioSessionEnumerator+0)+3*A_PtrSize), "Ptr", IAudioSessionEnumerator, "UIntP", SessionCount)
Loop % SessionCount
{
; IAudioSessionEnumerator::GetSession
DllCall(NumGet(NumGet(IAudioSessionEnumerator+0)+4*A_PtrSize), "Ptr", IAudioSessionEnumerator, "Int", A_Index-1, "PtrP", IAudioSessionControl)
IAudioSessionControl2 := ComObjQuery(IAudioSessionControl, IID_IAudioSessionControl2)
ObjRelease(IAudioSessionControl)
; IAudioSessionControl2::GetProcessId
DllCall(NumGet(NumGet(IAudioSessionControl2+0)+14*A_PtrSize), "Ptr", IAudioSessionControl2, "UIntP", ProcessId)
If (PID == ProcessId)
{
ISimpleAudioVolume := ComObjQuery(IAudioSessionControl2, IID_ISimpleAudioVolume)
if (volume + 0 != "")
; ISimpleAudioVolume::SetMasterVolume
DllCall(NumGet(NumGet(ISimpleAudioVolume+0)+3*A_PtrSize), "Ptr", ISimpleAudioVolume, "Float", volume/100.0, "Ptr", 0)
else
; ISimpleAudioVolume::SetMute
DllCall(NumGet(NumGet(ISimpleAudioVolume+0)+5*A_PtrSize), "Ptr", ISimpleAudioVolume, "UInt", volume = "mute" ? true : false, "Ptr", 0)
ObjRelease(ISimpleAudioVolume)
}
ObjRelease(IAudioSessionControl2)
}
ObjRelease(IAudioSessionEnumerator)
}