1 (изменено: __Михаил__, 2021-11-10 01:19:28)

Тема: AHK: Изменение громкости только в Хроме [Решено]

Данный скрипт меняет звук чисто в хроме. Недостаток - нужно указать PID иначе не работает.
Через костыль смог реализовать лишь такой вариант обхода обнаруженных PID хрома (по нажатию F2).

+ открыть спойлер
Vol := 20		; Начальный звук / Меняет обратно на это значение при обходе в поиске 'Chrome_Pid'.
Step := 3		; Шаг изм. громкости.
Chrome_Pid := 0		; Pid Audio Service (Shift+Esc в Хроме) - указать вручную / Нажать F2 для помощи в определении.
Wait := 1000		; Сколько ожидать реакции для записи нового 'Chrome_Pid'.
I_Start := 1		; С какого индекса начинать медленный обход с изм. звука.
Return

;----------------------------------------------------------------------------------

Up::
Down::
If !(Chrome_Pid){
 MsgBox, Вкладка не указана!`nНажмите F2 - для помощи.
 Return
}
Vol += (A_ThisHotkey = "Up" ? Step : -Step)
Vol := SetAppVolume(Chrome_Pid, vol)
Tool("Vol: " Vol)
Return

;----------------------------------------------------------------------------------
;Для помощи в указании 'Chrome_Pid':	(~16 номер при 17 вкладок)
F2::	;[euras] 01.06.2021	https://www.autohotkey.com/boards/viewtopic.php?p=402842#p402842
Ex=
SetTimer, GetPID_Gui, -1
Return

GetPID_Gui:
ToolTip, Нажать [Esc] при смене звука,0,0
I := 0
Gui Add, ListView, x2 y0 w100 h900, Номер|PID
For proc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
{
 If (proc.Name = "chrome.exe"){
  If (Ex = 1){
   Return
  }
  I++
  LV_Add("", "#" (I < 10 ? "0" I : I), proc.ProcessId)
  SetAppVolume(proc.ProcessId, 1)	; Меняет звук вкладки на 1% - для того чтобы определить нужный Pid.
  Gui Show,, Process List: Chrome.exe
  If (I >= I_Start)
   Sleep, Wait
  SetAppVolume(proc.ProcessId, Vol)	; Меняет звук вкладки. Если нужно будет повторить обход.
 }
}
If (I <> 0)
 Tool("Список составлен!",10000)
Else
 Tool("Хром не найден!",10000)
Return

GuiEscape:
Gui, Destroy
Ex := 1
Chrome_Pid := proc.ProcessId
Return

;----------------------------------------------------------------------------------
;[teadrinker] 21.06.2021	http://forum.script-coding.com/viewtopic.php?pid=148527#p148527
SetAppVolume(PID, Volume){  ; WIN_V+
 SetBatchLines -1
 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)
 Return Volume
}


Tool(Text, Wait := 1000){
 ToolTip, % Text, 0,0
 SetTimer, T_Off, -%Wait%
}
T_Off:
ToolTip
Return

Собственно вопрос как выяснить PID в Хроме, что отвечает за звук?

--------------------------
Upd: Рабочий вариант с быстрым обходом PIDs:

SetBatchLines -1
DllCall("LoadLibrary", "str", "Wtsapi32.dll", "ptr")
;---------------------------------------------------
Vol := 0.1		; Начальный звук (Vol: 1 = 100%).
Step := 0.03		; Шаг изм. громкости.
Return
;---------------------------------------------------

; Меняет звук в хроме:
Up::
Down::
Vol += (A_ThisHotkey = "Up" ? Step : -Step)
Vol := (Vol > 1 ? 1 : Vol < 0.01 ? 0.01 : Vol)

DllCall("Wtsapi32\WTSEnumerateProcesses", "ptr", 0, "uint", 0, "uint", 1, "ptr*", pProcessInfo, "uint*", count)
addr := pProcessInfo, PIDs := []
Loop % count
{
 if (StrGet(NumGet(addr + 8)) = "chrome.exe")
  PIDs[NumGet(addr + 4, "uint")] := 1
 addr += A_PtrSize = 4 ? 16 : 24
}
DllCall("Wtsapi32\WTSFreeMemory", "ptr", pProcessInfo)

IID_IAudioSessionManager2 := "{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
IID_ISimpleAudioVolume := "{87CE5498-68D6-44E5-9215-6DA47EF883D8}"

dev := VA_GetDevice()
if !dev
 throw "Can't get device"
if VA_IMMDevice_Activate(dev, IID_IAudioSessionManager2, 7, 0, mgr) != 0
 throw "Can't get session manager"
ObjRelease(dev)
if VA_IAudioSessionManager2_GetSessionEnumerator(mgr, enm) != 0
 throw "Can't get session enumerator"
ObjRelease(mgr)
VA_IAudioSessionEnumerator_GetCount(enm, count)

Loop % count
{
 ; IAudioSessionControl *session;
 VA_IAudioSessionEnumerator_GetSession(enm, A_Index-1, ssn)
 VA_IAudioSessionControl_GetDisplayName(ssn, name)
 VA_IAudioSessionControl2_GetProcessId(ssn, pid)
 sav := ComObjQuery(ssn, IID_ISimpleAudioVolume)
 ObjRelease(ssn)
 if !sav ; Unlikely?
  throw "Can't get Volume control"
 if PIDs[pid]{
  VA_ISimpleAudioVolume_SetMasterVolume(sav, Vol)
  ObjRelease(sav)
  break
 }
 ObjRelease(sav)
}
ObjRelease(enm)
Tool(Round(Vol*100) "%")
Return

VA_ISimpleAudioVolume_SetMasterVolume(this, Level, EventContext=""){
 Return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "uint", this, "float", Level, "uint", VA_GUID(EventContext))
}


Tool(Text, Wait := 1000){
 ToolTip, % Text, 0,0
 SetTimer, T_Off, -%Wait%
}
T_Off:
ToolTip
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

2

Re: AHK: Изменение громкости только в Хроме [Решено]

Просто меняйте громкость у всех сразу.

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

3

Re: AHK: Изменение громкости только в Хроме [Решено]

У всех сразу менять - много времени уходит, надоело.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Изменение громкости только в Хроме [Решено]

У меня занимает примерно 250 мс на 20 процессов msedge.

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

5

Re: AHK: Изменение громкости только в Хроме [Решено]

У меня от 150 до 200мс. если проц на Максимум в электропитании включить. Но у меня на постоянке включен режим Экономии, поэтому 250-300мс уходит.
Если использовать текущий скрипт с прямым изменением звука по PID'у то 0-15-16мс показывает.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6 (изменено: svoboden, 2021-11-08 19:57:29)

Re: AHK: Изменение громкости только в Хроме [Решено]

__Михаил__ пишет:

Собственно вопрос как выяснить PID в Хроме, что отвечает за звук?

Этим скриптом можно определить pid, что отвечает за звук.
http://forum.script-coding.com/viewtopi … 86#p104686.
А вообще раньше этот скрипт работал у меня, теперь нет:
https://forum.script-coding.com/viewtop … 10#p113810.

P.S.
А хотя нет, все работает, если pid, что отвечает за звук выставить по второй ссылке.

7

Re: AHK: Изменение громкости только в Хроме [Решено]

svoboden

Благодарю. Первая ссылка уже дала хороший результат - 3 найденных лучше чем 30-40.
В сторону этой библиотеки пытался копать, у меня несколько версий и в каждой что-то одно работало а другое нет, поэтому забросил её изучать.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

8 (изменено: svoboden, 2021-11-08 20:38:34)

Re: AHK: Изменение громкости только в Хроме [Решено]

__Михаил__, по идее, pid хрома отвечающий за звук должен быть один только. Просто скрипт перечисляет pid и уроверь громкости всех устройств в микшере.

9

Re: AHK: Изменение громкости только в Хроме [Решено]

Да я знаю что только один PID нужно найти, но в этом и есть вся проблема. Через полный обход процессов Хрома находит 30-40шт (код из шапки).
А так как по первой ссылки можно сузить этот список до минимума - легче вычислить нужный.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

10

Re: AHK: Изменение громкости только в Хроме [Решено]

wmi := ComObjGet("winmgmts:\\.\root\cimv2")
PIDs := []
for Process in wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
   PIDs[Process.processId] := 1

IID_IAudioSessionManager2 := "{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
IID_ISimpleAudioVolume := "{87CE5498-68D6-44E5-9215-6DA47EF883D8}"

dev := VA_GetDevice()
if !dev
    throw "Can't get device"
if VA_IMMDevice_Activate(dev, IID_IAudioSessionManager2, 7, 0, mgr) != 0
    throw "Can't get session manager"
ObjRelease(dev)
if VA_IAudioSessionManager2_GetSessionEnumerator(mgr, enm) != 0
    throw "Can't get session enumerator"
ObjRelease(mgr)
VA_IAudioSessionEnumerator_GetCount(enm, count)
Loop % count
{
    ; IAudioSessionControl *session;
    VA_IAudioSessionEnumerator_GetSession(enm, A_Index-1, ssn)
    VA_IAudioSessionControl_GetDisplayName(ssn, name)
    VA_IAudioSessionControl2_GetProcessId(ssn, pid)
    sav := ComObjQuery(ssn, IID_ISimpleAudioVolume)
    ObjRelease(ssn)
    if !sav ; Unlikely?
        throw "Can't get volume control"
    if PIDs[pid]
    {
       VA_ISimpleAudioVolume_SetMasterVolume(sav, volume)
       ObjRelease(sav)
       break
    }
    ObjRelease(sav)
}
ObjRelease(enm)
return

11

Re: AHK: Изменение громкости только в Хроме [Решено]

Если перебирать процессы через WMI, быстрее вряд ли будет.

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

12

Re: AHK: Изменение громкости только в Хроме [Решено]

У меня на не новом компе в среднем 28ms.

setbatchlines -1
wmi := ComObjGet("winmgmts:\\.\root\cimv2")
a := a_tickcount
loop 100
{
   PIDs := []
   for Process in wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
      PIDs[Process.processId] := 1
}
msgbox % a_tickcount - a

13 (изменено: teadrinker, 2021-11-08 21:48:00)

Re: AHK: Изменение громкости только в Хроме [Решено]

Думаю, большая часть времени уходит на загрузку wmi, особенно в первый раз.

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

14

Re: AHK: Изменение громкости только в Хроме [Решено]

Ну да, так гораздо (+-в 10 раз) быстрее будет:

setbatchlines -1
DllCall("LoadLibrary", "str", "Wtsapi32.dll", "ptr")
a := a_tickcount
loop 100
{
   DllCall("Wtsapi32\WTSEnumerateProcesses", "ptr", 0, "uint", 0, "uint", 1, "ptr*", pProcessInfo, "uint*", count)
   addr := pProcessInfo, PIDs := []
   Loop % count
   {
      if (StrGet(NumGet(addr + 8)) = "chrome.exe")
         PIDs[NumGet(addr + 4, "uint")] := 1
      addr += A_PtrSize = 4 ? 16 : 24
   }
   DllCall("Wtsapi32\WTSFreeMemory", "ptr", pProcessInfo)
}
msgbox % a_tickcount - a

15

Re: AHK: Изменение громкости только в Хроме [Решено]

А можете объяснить. Откудово берутся числа 16 : 24, очень часто в примерах встречаются. A_PtrSize - это размер указателя - это понятно.

16 (изменено: teadrinker, 2021-11-09 19:38:13)

Re: AHK: Изменение громкости только в Хроме [Решено]

Это размер WTS_PROCESS_INFO.

Malcev пишет:
    if PIDs[pid]
    {
       VA_ISimpleAudioVolume_SetMasterVolume(sav, volume)
       ObjRelease(sav)
       break
    }

Собственно, в моём скрипте этот механизм уже реализован.
Чтобы не тащить всю библиотеку:

SetAppVolume("msedge.exe", 100)
; SetAppVolume("msedge.exe", "mute")
; SetAppVolume("msedge.exe", "unmute")

SetAppVolume(processName, volume) ; volume can be number 0 — 100 or "mute" or "unmute"
{
   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
        
   PIDs := EnumProcessesByName(processName)
   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 PIDs[ProcessId]
      {
         ISimpleAudioVolume := ComObjQuery(IAudioSessionControl2, IID_ISimpleAudioVolume)
         if (volume + 0 != "")
            ; ISimpleAudioVolume::SetMasterVolume
            DllCall(NumGet(NumGet(ISimpleAudioVolume+0)+3*A_PtrSize), "Ptr", ISimpleAudioVolume, "Float", volume/100, "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)
}

EnumProcessesByName(searchName) {
   if !DllCall("Wtsapi32\WTSEnumerateProcesses", "Ptr", 0, "UInt", 0, "UInt", 1, "PtrP", pProcessInfo, "UIntP", count)
      throw Exception("WTSEnumerateProcesses failed. A_LastError: " . A_LastError)
   
   addr := pProcessInfo, PIDs := {}
   Loop % count  {
      procName := StrGet( NumGet(addr + 8) )
      if (procName = searchName)
         PID := NumGet(addr + 4, "UInt"), PIDs[PID] := true
      addr += 8 + A_PtrSize*2
   }
   DllCall("Wtsapi32\WTSFreeMemory", "Ptr", pProcessInfo)
   Return PIDs
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Изменение громкости только в Хроме [Решено]

teadrinker пишет:

У меня занимает примерно 250 мс на 20 процессов msedge.

У msedge же как и у хрома только один процесс отвечает за звук.
Поэтому при найденном pid можно делать break.

If PIDs[ProcessId]
   ....
   break

18

Re: AHK: Изменение громкости только в Хроме [Решено]

Да, но вдруг у какого-то другого приложения это не так? В данном случае на общее время выполнения никак не повлияет.

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

19 (изменено: svoboden, 2021-11-09 16:59:17)

Re: AHK: Изменение громкости только в Хроме [Решено]

teadrinker пишет:

Это размер WTS_PROCESS_INFO.

А зачем этот размер нужно прибавлять к pProcessInfo. Тоже часто встречаю, где разные числа прибавляются похожим образом.

20

Re: AHK: Изменение громкости только в Хроме [Решено]

svoboden, Чтобы перебирать массив с этими структурами.
teadrinker, А почему у тебя count как ptr, он же dword?

if !DllCall("Wtsapi32\WTSEnumerateProcesses", "Ptr", 0, "UInt", 0, "UInt", 1, "PtrP", pProcessInfo, "PtrP", count)

21 (изменено: __Михаил__, 2021-11-09 19:28:45)

Re: AHK: Изменение громкости только в Хроме [Решено]

Malcev

Отличный пример, работает за 15мс. если сделать так:

If !PIDs{	; Сокращает время до минимума:
 wmi := ComObjGet("winmgmts:\\.\root\cimv2")
 PIDs := []
 for Process in wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
  PIDs[Process.processId] := 1
 IID_IAudioSessionManager2 := "{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
 IID_ISimpleAudioVolume := "{87CE5498-68D6-44E5-9215-6DA47EF883D8}"
}
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

22

Re: AHK: Изменение громкости только в Хроме [Решено]

PIDs могут меняться, лучше так.

setbatchlines -1
DllCall("LoadLibrary", "str", "Wtsapi32.dll", "ptr")

f11::
DllCall("Wtsapi32\WTSEnumerateProcesses", "ptr", 0, "uint", 0, "uint", 1, "ptr*", pProcessInfo, "uint*", count)
addr := pProcessInfo, PIDs := []
Loop % count
{
   if (StrGet(NumGet(addr + 8)) = "chrome.exe")
      PIDs[NumGet(addr + 4, "uint")] := 1
   addr += A_PtrSize = 4 ? 16 : 24
}
DllCall("Wtsapi32\WTSFreeMemory", "ptr", pProcessInfo)

23

Re: AHK: Изменение громкости только в Хроме [Решено]

Я так понимаю они могут измениться только в случае перезапуска Хрома? Тогда можно оставить так, я обычно не выключаю его.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

24

Re: AHK: Изменение громкости только в Хроме [Решено]

Malcev пишет:

А почему у тебя count как ptr, он же dword?

Да, ошибка, должно быть "UIntP".

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

25

Re: AHK: Изменение громкости только в Хроме [Решено]

__Михаил__, по идее меняться не должен, но знаю точно, что у хрома, процесс отвечающий за аудио создается только после начала проигрывания музыки.

26

Re: AHK: Изменение громкости только в Хроме [Решено]

Malcev
Хорошо, уговорили.

Обновил шапку последней правкой.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

27 (изменено: svoboden, 2021-11-10 11:05:08)

Re: AHK: Изменение громкости только в Хроме [Решено]

Malcev пишет:

Чтобы перебирать массив с этими структурами.

Понятно. А почему в этой строке:

 if (StrGet(NumGet(addr + 8)) = "chrome.exe")

сравнивается c "chrome.exe". Пробовал так:

setbatchlines -1
DllCall("LoadLibrary", "str", "Wtsapi32.dll", "ptr")

loop 100
{
   DllCall("Wtsapi32\WTSEnumerateProcesses", "ptr", 0, "uint", 0, "uint", 1, "ptr*", pProcessInfo, "uint*", count)
   addr := pProcessInfo
   
      var := StrGet(NumGet(addr + 8), "utf-16")
       msgbox % var

   DllCall("Wtsapi32\WTSFreeMemory", "ptr", pProcessInfo)
}

Возвращает знаки вопроса.

28

Re: AHK: Изменение громкости только в Хроме [Решено]

Во-первых, вы криво изменили код.
Во-вторых, если в strget кодировку не указывать, то возвращается не utf-16, а ansi.

29 (изменено: svoboden, 2021-11-10 17:36:09)

Re: AHK: Изменение громкости только в Хроме [Решено]

Так я и не менял его даже. Просто хотел получить имя процесса здесь:

StrGet(NumGet(addr + 8))

У меня всегда пустая строка возвращается. Решил сменить на utf-16, знаки вопроса.

30

Re: AHK: Изменение громкости только в Хроме [Решено]

Сравните ваш и правильный.

setbatchlines -1
DllCall("LoadLibrary", "str", "Wtsapi32.dll", "ptr")
DllCall("Wtsapi32\WTSEnumerateProcesses", "ptr", 0, "uint", 0, "uint", 1, "ptr*", pProcessInfo, "uint*", count)
addr := pProcessInfo
Loop % count
{
   var := StrGet(NumGet(addr + 8))
   msgbox % var
   addr += A_PtrSize = 4 ? 16 : 24
}
DllCall("Wtsapi32\WTSFreeMemory", "ptr", pProcessInfo)

31 (изменено: svoboden, 2021-11-10 17:56:19)

Re: AHK: Изменение громкости только в Хроме [Решено]

Проверил, выдает пустое значения, что в анси, что в юникод.

32

Re: AHK: Изменение громкости только в Хроме [Решено]

Ну не знаю.
У меня на 3 компьютерах выдает нужные значения.

33 (изменено: svoboden, 2021-11-10 18:09:03)

Re: AHK: Изменение громкости только в Хроме [Решено]

Все, заработало. Первый результат пустое значение выдал.

34 (изменено: svoboden, 2021-11-10 18:25:12)

Re: AHK: Изменение громкости только в Хроме [Решено]

А так нельзя написать?

 var := StrGet(NumGet(addr + 24))

Чтобы не было пустого значения в начале цикла. Ну это так .

35

Re: AHK: Изменение громкости только в Хроме [Решено]

Можно сделать так:

Setbatchlines -1
DllCall("LoadLibrary", "str", "Wtsapi32.dll", "ptr")
DllCall("Wtsapi32\WTSEnumerateProcesses", "ptr", 0, "uint", 0, "uint", 1, "ptr*", pProcessInfo, "uint*", count)
addr := pProcessInfo
Loop % count
{
   if (A_Index = 1)
      var := "System Idle Process"
   else
      var := StrGet(NumGet(addr + 8))
   msgbox % var
   addr += A_PtrSize = 4 ? 16 : 24
}
DllCall("Wtsapi32\WTSFreeMemory", "ptr", pProcessInfo)

36

Re: AHK: Изменение громкости только в Хроме [Решено]

Хорошо, спасибо.