1 (изменено: Gh0sTG0, 2021-06-20 23:36:58)

Тема: AHK: Замутить и потом размутить одну программу win10 [решено]

Добрый день.
Столкнулся с потребностью внешнего регулирования звука одной программы.
В определенный момент, мне бы хотелось чтобы я нажал кнопку и программа замутилась.
Потом нажал и программа размутилась.
Вариант с установкой определенной громкости не устраивает, т.к. в разные направления (наушники, блютус колонка) в винде стоит разная громкость. Хотя, возможно как то прицепиться к общей громкости винды и уже на нее выставлять громкость проги.
В идеале имитировать нажатие кнопки mute в микшере громкости винды, но вариант с 0-громкость системы тоже норм.
Это как то возможно реализовать? Или полномочия АХК тут все?
В интернете поискал, но чего то ничего особо дельного не нашел.

2

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Общую громкость знаю как отключить:

F3:: Send, {Volume_Mute}

А в отдельной программе - не знаю. В Win7 можно через микшер громкости. Но на него нету горячих клавиш.

3 (изменено: Gh0sTG0, 2021-06-20 22:34:07)

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

ypppu пишет:

Общую громкость знаю как отключить:

F3:: Send, {Volume_Mute}

А в отдельной программе - не знаю.

Это то и я нашел Но оно совсем не то, глушить одновременно с прогой тот же ютуб или аудио/видеоплеер это вообще не вариант...

4

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Наверное каким-то чудом определить в микшере громкости HWND кнопки "mute", относящейся к целевой программе. И потом посылать клик в этот ЭУ.

5 (изменено: Gh0sTG0, 2021-06-20 23:07:03)

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Ок, я искал-искал, и возможно нашел. Походу вот эта штука могет:
https://www.reddit.com/r/AutoHotkey/comments/f38o95/muting_specific_application_with_nircmd/
Или нет... Оно походу только под 7ку...

6 (изменено: Gh0sTG0, 2021-06-20 23:44:02)

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Как подсказали на реддите, я был близко =__= надо было оттуда не нирсмд качать, а саундвольюмвью.
https://www.nirsoft.net/utils/sound_volume_view.html
А дальше делается:

run, D:\ahk\SoundVolumeView.exe /Switch BlueStacks

Более того, у этой штуки даже есть GUI, в котором можно посмотреть, попробовать замутить-размутить, и даже скопировать название программы, которое потом нужно подсовывать командой.

7

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Попробуйте так:

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)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: Gh0sTG0, 2021-06-21 00:40:28)

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

teadrinker
О___О Какая огромная штука...
Мб все таки проще run, D:\ahk\SoundVolumeView.exe /Switch BlueStacks ?
И, я правильно понял, что оно тыркает 0/100? Или все таки 0/системная громкость?

9

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Не знаю, как больше нравится. Технически проще кодом AHK, чтобы не запускать стороннее приложение.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Gh0sTG0 пишет:

И, я правильно понял, что оно тыркает 0/100?

Нет, по первой клавише mute/unmute, по второй прибавляет громкость, по третьей убавляет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

teadrinker
Завтра из интереса попробую переделать под ваш код.

12

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

teadrinker
Спасибо, работает.

13

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

teadrinker Кстати, а почему не получается взять значение mute/unmute из системы, а не хранить его в программе?

14

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Почему не получается, можно взять из системы.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15 (изменено: Gh0sTG0, 2021-06-21 15:43:47)

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

teadrinker А тогда зачем значение mute-unmute хранить в переменной?

mute := 0
!Space::
   mute := !mute

16

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

Проще.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Замутить и потом размутить одну программу win10 [решено]

teadrinker А, ясно.