Тема: AHK: Управление звуком в windows 7
Как в windows 7 управлять звуком (прибавить-убавить-задать значение-прочитать значение) без помощи Vista Audio Control Function Reference?
SoundSet не работает.
Win10x64 AhkSpy, Hotkey, ClockGui
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как в windows 7 управлять звуком (прибавить-убавить-задать значение-прочитать значение) без помощи Vista Audio Control Function Reference?
SoundSet не работает.
А чем ваc не устраивает VA.ahk?
VA_SetMasterVolume(VA_GetMasterVolume()+5)
долго думает при изменении громкости
Если нужно управлять лишь уровнем «MasterVolume устройства воспроизведения по умолчанию» можно воспользоваться следующим огрызком оригинальной библиотеки:
; получить значение:
MsgBox % SoundVolume.level
; установить значение:
Mbutton::SoundVolume.level := 25, SoundVolume.tooltip
; увеличить или уменьшить значение:
WheelUp::SoundVolume.level += 10, SoundVolume.tooltip
WheelDown::SoundVolume.level -= 10, SoundVolume.tooltip
; Дальше можно не читать.
Class SoundVolumeControl
{
__Set(key, value) {
If (key = "level") {
vol := value > 100 ? 100 : value < 0 ? 0 : value
aev := this.GetAudioEndpointVolume()
, DllCall(NumGet(NumGet(aev+0)+7*A_PtrSize), "ptr", aev, "float", vol/100)
, ObjRelease(aev)
return this.currentLevel := vol
}
}
__Get(key) {
If (key = "level") {
aev := this.GetAudioEndpointVolume()
, DllCall(NumGet(NumGet(aev+0)+9*A_PtrSize), "ptr", aev, "float*", vol)
, ObjRelease(aev)
return this.currentLevel := Round(vol*100)
}
Else If (key = "tooltip") {
CoordMode, ToolTip
ToolTip, % "Volume: " . this.currentLevel . "%", A_ScreenWidth, 3
SetTimer, REMOVE_TOOLTIP, -1000
return ""
}
}
GetAudioEndpointVolume() {
DllCall("ole32\CoCreateInstance"
, "ptr", this.GUID(CLSID_MMDeviceEnumerator, "{BCDE0395-E52F-467C-8E3D-C4579291692E}")
, "ptr", 0
, "uint", 21
, "ptr", this.GUID(IID_IMMDeviceEnumerator, "{A95664D2-9614-4F35-A746-DE8DB63617E6}")
, "ptr*", deviceEnumerator)
, DllCall(NumGet(NumGet(deviceEnumerator+0)+4*A_PtrSize)
, "ptr", deviceEnumerator
, "uint", 0
, "uint", 0
, "ptr*", device)
, ObjRelease(deviceEnumerator)
, DllCall(NumGet(NumGet(device+0)+3*A_PtrSize)
, "ptr", device
, "ptr", this.GUID(iid, "{5CDF2C82-841E-4546-9722-0CF74078229A}")
, "uint", 7
, "uint", 0
, "ptr*", endpointVolume)
, ObjRelease(device)
return endpointVolume
}
GUID(ByRef guid_out, guid_in) {
VarSetCapacity(guid_out, 16, 0), DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out)
return &guid_out
}
}
Class SoundVolume extends SoundVolumeControl
{
static currentLevel
}
REMOVE_TOOLTIP:
ToolTip
return
creature.ws
SoundVolume.level += 5
; Дальше можно не читать.
Class SoundVolumeControl
{
__Set(key, value) {
If (key = "level") {
vol := value > 100 ? 100 : value < 0 ? 0 : value
aev := this.GetAudioEndpointVolume()
, DllCall(NumGet(NumGet(aev+0)+7*A_PtrSize), "ptr", aev, "float", vol/100)
, ObjRelease(aev)
return this.currentLevel := vol
}
}
__Get(key) {
If (key = "level") {
aev := this.GetAudioEndpointVolume()
, DllCall(NumGet(NumGet(aev+0)+9*A_PtrSize), "ptr", aev, "float*", vol)
, ObjRelease(aev)
return this.currentLevel := Round(vol*100)
}
Else If (key = "tooltip") {
CoordMode, ToolTip
ToolTip, % "Volume: " . this.currentLevel . "%", A_ScreenWidth, 3
return ""
}
}
GetAudioEndpointVolume() {
DllCall("ole32\CoCreateInstance"
, "ptr", this.GUID(CLSID_MMDeviceEnumerator, "{BCDE0395-E52F-467C-8E3D-C4579291692E}")
, "ptr", 0
, "uint", 21
, "ptr", this.GUID(IID_IMMDeviceEnumerator, "{A95664D2-9614-4F35-A746-DE8DB63617E6}")
, "ptr*", deviceEnumerator)
, DllCall(NumGet(NumGet(deviceEnumerator+0)+4*A_PtrSize)
, "ptr", deviceEnumerator
, "uint", 0
, "uint", 0
, "ptr*", device)
, ObjRelease(deviceEnumerator)
, DllCall(NumGet(NumGet(device+0)+3*A_PtrSize)
, "ptr", device
, "ptr", this.GUID(iid, "{5CDF2C82-841E-4546-9722-0CF74078229A}")
, "uint", 7
, "uint", 0
, "ptr*", endpointVolume)
, ObjRelease(device)
return endpointVolume
}
GUID(ByRef guid_out, guid_in) {
VarSetCapacity(guid_out, 16, 0), DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out)
return &guid_out
}
}
Class SoundVolume extends SoundVolumeControl
{
static currentLevel
}
return
Спасибо это не тормозит!
А ещё можно уменьшить код?
Else If (key = "tooltip") {
CoordMode, ToolTip
ToolTip, % "Volume: " . this.currentLevel . "%", A_ScreenWidth, 3
return ""
с этим не знаю как быть , мне "tooltip" не надо.
И есть ли возможность функции MUTE, как 0 сделать понятно, а как чтоб предыдущая возвращалась громкость?
Ещё вопрос: как заставить работать с Параметром командной строки
SoundVolume.level += %1%
это не работает
Не надо tooltip — не используйте. Желаете уменьшить — уменьшайте
Можно сохранять значение громкости до уменьшения до нуля, а можно по аналогии из va.ahk добавить реализацию требуемой функции.
как заставить работать с Параметром командной строки?
SoundVolume.level += %1%
Это к теме никак не относится параметры командной строки напрямую в выражениях использовать не получится.
creature.ws
Спасибо за помощь
Добавлено mute
; получить значение:
SoundVolume.level
; установить значение:
Mbutton::SoundVolume.level := 25
; увеличить или уменьшить значение:
WheelUp::SoundVolume.level += 10
WheelDown::SoundVolume.level -= 10
; заглушить:
!MButton::SoundVolume.mute := !SoundVolume.mute
Class SoundVolumeControl
{
__Set(key, value) {
aev := this.GetAudioEndpointVolume()
If (key = "level")
{
value := value > 100 ? 100 : value < 0 ? 0 : value
DllCall(NumGet(NumGet(aev+0)+7*A_PtrSize), "ptr", aev, "float", value/100), ObjRelease(aev)
return value, this.showToolTip && this.ToolTip("Volume: " . value . "%")
}
Else If (key = "mute")
{
DllCall(NumGet(NumGet(aev+0)+14*A_PtrSize), "ptr", aev, "int", value? 1:0, "ptr", this.VA_GUID(GuidEventContext)), ObjRelease(aev)
return value, this.showToolTip && this.ToolTip((value? "M":"Unm") "ute master volume")
}
ELse return "", ObjRelease(aev)
}
__Get(key) {
aev := this.GetAudioEndpointVolume()
If (key = "level")
{
DllCall(NumGet(NumGet(aev+0)+9*A_PtrSize), "ptr", aev, "float*", vol), ObjRelease(aev)
return this.savedLevel := Round(vol*100), this.showToolTip && this.ToolTip("Volume: " . this.savedLevel . "%")
}
Else If (key = "mute")
{
DllCall(NumGet(NumGet(aev+0)+15*A_PtrSize), "ptr", aev, "int*", muteState), ObjRelease(aev)
return muteState
}
ELse return "", ObjRelease(aev)
}
ToolTip(text) {
CoordMode, ToolTip
ToolTip, %text%, A_ScreenWidth, 3
SetTimer, REMOVE_TOOLTIP, -1000
}
GetAudioEndpointVolume() {
DllCall("ole32\CoCreateInstance"
, "ptr", this.GUID(CLSID_MMDeviceEnumerator, "{BCDE0395-E52F-467C-8E3D-C4579291692E}")
, "ptr", 0
, "uint", 21
, "ptr", this.GUID(IID_IMMDeviceEnumerator, "{A95664D2-9614-4F35-A746-DE8DB63617E6}")
, "ptr*", deviceEnumerator)
, DllCall(NumGet(NumGet(deviceEnumerator+0)+4*A_PtrSize)
, "ptr", deviceEnumerator
, "uint", 0
, "uint", 0
, "ptr*", device)
, ObjRelease(deviceEnumerator)
, DllCall(NumGet(NumGet(device+0)+3*A_PtrSize)
, "ptr", device
, "ptr", this.GUID(iid, "{5CDF2C82-841E-4546-9722-0CF74078229A}")
, "uint", 7
, "uint", 0
, "ptr*", endpointVolume)
, ObjRelease(device)
return endpointVolume
}
GUID(ByRef guid_out, guid_in) {
VarSetCapacity(guid_out, 16, 0), DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out)
return &guid_out
}
}
Class SoundVolume extends SoundVolumeControl
{
static savedLevel
static showToolTip := True
}
REMOVE_TOOLTIP:
ToolTip
return
NumpadAdd::PostMessage, 0x319,, 10<<16,, ahk_class Progman ; increase
NumpadSub::PostMessage, 0x319,, 9<<16,, ahk_class Progman ; decrease
NumpadMult::PostMessage, 0x319,, 8<<16,, ahk_class Progman ; mute
^NumpadAdd::PostMessage, 0x319,, 26<<16,, ahk_class Progman ; mic_increase
^NumpadSub::PostMessage, 0x319,, 25<<16,, ahk_class Progman ; mic_decrease
^NumpadMult::PostMessage, 0x319,, 24<<16,, ahk_class Progman ; mic_mute
/*
WM_APPCOMMAND = $0319;
APPCMD_FIRST = $8000;
APPCOMMAND_BROWSER_BACKWARD = APPCMD_FIRST +1
APPCOMMAND_BROWSER_FORWARD = APPCMD_FIRST +2
APPCOMMAND_BROWSER_REFRESH = APPCMD_FIRST +3
APPCOMMAND_BROWSER_STOP = APPCMD_FIRST +4
APPCOMMAND_BROWSER_SEARCH = APPCMD_FIRST +5
APPCOMMAND_BROWSER_FAVORITES = APPCMD_FIRST +6
APPCOMMAND_BROWSER_HOME = APPCMD_FIRST +7
APPCOMMAND_VOLUME_MUTE = APPCMD_FIRST +8
APPCOMMAND_VOLUME_DOWN = APPCMD_FIRST +9
APPCOMMAND_VOLUME_UP = APPCMD_FIRST +10
APPCOMMAND_MEDIA_NEXTTRACK = APPCMD_FIRST +11
APPCOMMAND_MEDIA_PREVIOUSTRACK = APPCMD_FIRST +12
APPCOMMAND_MEDIA_STOP = APPCMD_FIRST +13
APPCOMMAND_MEDIA_PLAY_PAUSE = APPCMD_FIRST +14
APPCOMMAND_LAUNCH_MAIL = APPCMD_FIRST +15
APPCOMMAND_LAUNCH_MEDIA_SELECT = APPCMD_FIRST +16
APPCOMMAND_LAUNCH_APP1 = APPCMD_FIRST +17
APPCOMMAND_LAUNCH_APP2 = APPCMD_FIRST +18
APPCOMMAND_BASS_DOWN = APPCMD_FIRST +19
APPCOMMAND_BASS_BOOST = APPCMD_FIRST +20
APPCOMMAND_BASS_UP = APPCMD_FIRST +21
APPCOMMAND_TREBLE_DOWN = APPCMD_FIRST +22
APPCOMMAND_TREBLE_UP = APPCMD_FIRST +23
APPCOMMAND_MICROPHONE_VOLUME_MUTE = APPCMD_FIRST +24
APPCOMMAND_MICROPHONE_VOLUME_DOWN = APPCMD_FIRST +25
APPCOMMAND_MICROPHONE_VOLUME_UP = APPCMD_FIRST +26
APPCOMMAND_HELP = APPCMD_FIRST +27
APPCOMMAND_FIND = APPCMD_FIRST +28
APPCOMMAND_NEW = APPCMD_FIRST +29
APPCOMMAND_OPEN = APPCMD_FIRST +30
APPCOMMAND_CLOSE = APPCMD_FIRST +31
APPCOMMAND_SAVE = APPCMD_FIRST +32
APPCOMMAND_PRINT = APPCMD_FIRST +33
APPCOMMAND_UNDO = APPCMD_FIRST +34
APPCOMMAND_REDO = APPCMD_FIRST +35
APPCOMMAND_COPY = APPCMD_FIRST +36
APPCOMMAND_CUT = APPCMD_FIRST +37
APPCOMMAND_PASTE = APPCMD_FIRST +38
APPCOMMAND_REPLY_TO_MAIL = APPCMD_FIRST +39
APPCOMMAND_FORWARD_MAIL = APPCMD_FIRST +40
APPCOMMAND_SEND_MAIL = APPCMD_FIRST +41
APPCOMMAND_SPELL_CHECK = APPCMD_FIRST +42
APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE = APPCMD_FIRST +43
APPCOMMAND_MIC_ON_OFF_TOGGLE = APPCMD_FIRST +44
APPCOMMAND_CORRECTION_LIST = APPCMD_FIRST +45
APPCOMMAND_MEDIA_PLAY = APPCMD_FIRST +46
APPCOMMAND_MEDIA_PAUSE = APPCMD_FIRST +47
APPCOMMAND_MEDIA_RECORD = APPCMD_FIRST +48
APPCOMMAND_MEDIA_FAST_FORWARD = APPCMD_FIRST +49
APPCOMMAND_MEDIA_REWIND = APPCMD_FIRST +50
APPCOMMAND_MEDIA_CHANNEL_UP = APPCMD_FIRST +51
APPCOMMAND_MEDIA_CHANNEL_DOWN = APPCMD_FIRST +52
*/
А определить положение ползунка громкости подобным способом возможно?
Grey
PostMessage, 0x319,, 8<<16,, ahk_class Progman ; mute
Про муть это вы хорошо напомнили, я этот способ сразу пробовал и забыл, собственно и просто Send {Volume_Mute} робит.
Товарищи, будьте добры помочь мне:
Под XP был скрпит:
Loop
{
IfWinExist, Калькулятор Плюс
{
SoundSet, 1,, Mute
}
else
{
SoundSet, 0,, Mute
}
Sleep 500
}
Но эта зараза в семерке более не рабоатет. Помогите плиз, как заставить работать в семерке. Функции увеличения/уменьшения не нужны. Нужно просто тупо включать/выключать звук при отсутствии/наличии определенного окна соотвественно. Желательно чтоб не было ничего лишнего.
Товарищи, будьте добры помочь мне:
Под XP был скрпит:
Но эта зараза в семерке более не рабоатет. Помогите плиз, как заставить работать в семерке. Функции увеличения/уменьшения не нужны. Нужно просто тупо включать/выключать звук при отсутствии/наличии определенного окна соотвественно. Желательно чтоб не было ничего лишнего.
VA_SetMasterMute(false, 1)
VA_SetMasterMute(True, 1)
Vista Audio Control Function Reference
http://www.autohotkey.com/community/vie … hp?t=23792
Send {Volume_Mute}
PostMessage, 0x319,, 8<<16,, ahk_class Progman ; mute
serzh82saratovх
Большое спасибо за ссылки. Появилась надежда
Подскажите пожалуйста, как добавить Vista Audio Control Function Reference к AutoHotKey? Скопировать код в мой AHK скрипт? Или есть папка типа библиотке куда нужно ложить дополнительные AHK-файлы. там просто помимо ista Audio Control Function Reference нужно к ней самой COM Standard Library а к той еще и : ComCall via DllCall. Масло масленное короче.
Создайте в корневой директории программы папку Lib, и положите туда.
Всем спасибо! Вопрос решен!
В соответствующей теме офф форума написано:
Notes for v2.1:
Requires AutoHotkey_L (any recent build should work).
COM.ahk is NOT required. COM_Init() does NOT need to be called.Notes for v2.0:
Requires Sean's Standard Library COM.ahk
COM must be initialized prior to calling any VA functions: COM_Init().
Если используете AHK_L, COM.ahk никуда складывать не нужно, VA.ahk должна быть версии 2.1
Да, все, вопрос решился. Я пока исправлял свое сообщение, вы уже успели написать. Просто в системе было установлено 2 Autohotkey - один х86, второй х64. Через 86 не работало.
Спасибо!
Не просто «x86», а AHK-Basic версии 1.0.48.05 или меньше. Это в ней отсутствует ObjRelease()
Позвольте поинтересоваться. А вообще насколько трудно вытащить тело скрипта из упакованного exe файла. Я просто до сегодняшнего дня в основном все на VBS делал и использовал Stunnix VBS Obfuscator для сокрытия кода. Честно говоря разработака скриптиов на VBS на 2 порядка сложнее написания подобного на AutoHotkey - я вообще в восторге от данной тулзы. Вот последнее что меня сейчас волнует, так это не смогут ли прочесть мои скрипты?
OFF:
Честно говоря разработака скриптиов на VBS на 2 порядка сложнее написания подобного на AutoHotkey…
Кому как .
Позвольте поинтересоваться. А вообще насколько трудно вытащить тело скрипта из упакованного exe файла. Я просто до сегодняшнего дня в основном все на VBS делал и использовал Stunnix VBS Obfuscator для сокрытия кода. Честно говоря разработака скриптиов на VBS на 2 порядка сложнее написания подобного на AutoHotkey - я вообще в восторге от данной тулзы. Вот последнее что меня сейчас волнует, так это не смогут ли прочесть мои скрипты?
:):) только сегодня тему создал http://forum.script-coding.com/viewtopi … 781#p61781
Но можно как-то ставить код на скрипт где-то в справке давно видел.
Подскажите пожалуйста скрипт чтобы при зажатии комбинации клавиш или одной, звук уменьшался на 50% а при отжатии возвращался на 100%, это для удобства разговора по скайпу и подобным программам.
~Capslock::
SoundVolume.level := SoundVolume.level//2
KeyWait, Capslock
SoundVolume.level := SoundVolume.level*2
return
Class SoundVolumeControl
{
__Set(key, value) {
aev := this.GetAudioEndpointVolume()
If (key = "level")
{
value := value > 100 ? 100 : value < 0 ? 0 : value
DllCall(NumGet(NumGet(aev+0)+7*A_PtrSize), "ptr", aev, "float", value/100), ObjRelease(aev)
return value, this.showToolTip && this.ToolTip("Volume: " . value . "%")
}
Else If (key = "mute")
{
DllCall(NumGet(NumGet(aev+0)+14*A_PtrSize), "ptr", aev, "int", value? 1:0, "ptr", this.VA_GUID(GuidEventContext)), ObjRelease(aev)
return value, this.showToolTip && this.ToolTip((value? "M":"Unm") "ute master volume")
}
ELse return "", ObjRelease(aev)
}
__Get(key) {
aev := this.GetAudioEndpointVolume()
If (key = "level")
{
DllCall(NumGet(NumGet(aev+0)+9*A_PtrSize), "ptr", aev, "float*", vol), ObjRelease(aev)
return this.savedLevel := Round(vol*100), this.showToolTip && this.ToolTip("Volume: " . this.savedLevel . "%")
}
Else If (key = "mute")
{
DllCall(NumGet(NumGet(aev+0)+15*A_PtrSize), "ptr", aev, "int*", muteState), ObjRelease(aev)
return muteState
}
ELse return "", ObjRelease(aev)
}
ToolTip(text) {
CoordMode, ToolTip
ToolTip, %text%, A_ScreenWidth, 3
SetTimer, REMOVE_TOOLTIP, -1000
}
GetAudioEndpointVolume() {
DllCall("ole32\CoCreateInstance"
, "ptr", this.GUID(CLSID_MMDeviceEnumerator, "{BCDE0395-E52F-467C-8E3D-C4579291692E}")
, "ptr", 0
, "uint", 21
, "ptr", this.GUID(IID_IMMDeviceEnumerator, "{A95664D2-9614-4F35-A746-DE8DB63617E6}")
, "ptr*", deviceEnumerator)
, DllCall(NumGet(NumGet(deviceEnumerator+0)+4*A_PtrSize)
, "ptr", deviceEnumerator
, "uint", 0
, "uint", 0
, "ptr*", device)
, ObjRelease(deviceEnumerator)
, DllCall(NumGet(NumGet(device+0)+3*A_PtrSize)
, "ptr", device
, "ptr", this.GUID(iid, "{5CDF2C82-841E-4546-9722-0CF74078229A}")
, "uint", 7
, "uint", 0
, "ptr*", endpointVolume)
, ObjRelease(device)
return endpointVolume
}
GUID(ByRef guid_out, guid_in) {
VarSetCapacity(guid_out, 16, 0), DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out)
return &guid_out
}
}
Class SoundVolume extends SoundVolumeControl
{
static savedLevel
static showToolTip := true ; изменить true на false для отключения Toolltip
}
REMOVE_TOOLTIP:
ToolTip
return
Если имелись в виду проценты максимальной громкости — измените деление и умножение на присваивание абсолютных значений
Спасибо! Но вот что получилось:
скопировал не чего не меняя. не обязательно проценты, это я написал чтобы смысл был понятен.
#q::
SoundSet, 50, Master
KeyWait, q
SoundSet, 100, Master
return
Почему AHK изменяет звук у самого себя, а не у системы?
SoundSet? странно что вообще не ругается.
Vista Audio Control Function Reference попроще
Я плохо разбираюсь но смотрю справку и читаю, так почему в "SoundSet, NewSetting [, ComponentType, ControlType, DeviceNumber]" - значение ComponentType не читается, или я что-то неправильно понял?
В семёрке не робит, только ХР
Честно говоря сам громкость меняю через http://vdasus.com/2010/03/30/a-znaete-l … oe-nircmd/
както по шустрее
Run, C:\Windows\nircmd.exe setsysvolume 32767
Run, C:\Windows\nircmd.exe setsysvolume 65535
а SoundVolume.level почему не работает?
Мне надо на кнопку, чтобы я включал микрофон и звук в колонках уменьшался.
«SoundVolume.level» будет работать в ahk_l
Спасибо Большое!
А возможно сделать тоже самое, но с уровнем усилением микрофона? Дело в том что у меня глючит звуковуха и после перезагрузки или просто иногда при работе компа, выключается "усиление микрофона", но немного непонятно потому что когда открываешь свойства микрофона во вкладке "уровни" усиление ползунок стоит всегда на +20, но усиление не работает, а чтобы заработало я двигаю ползунок на +30 и обратно на +20 и тогда оно включается снова, вот эту функцию мне бы хотелось перенести на горячею клавишу.
вроде в Vista Audio Control Function Reference есть такое
http://www.autohotkey.net/~Lexikos/VA/V … sterVolume
Правда покурить их сейчас не получится The requested URL was not found on this server.
вроде в Vista Audio Control Function Reference есть такое
http://www.autohotkey.net/~Lexikos/VA/V … sterVolume
Правда покурить их сейчас не получится The requested URL was not found on this server.
Я пробовал почитать что это но так и не понял (туго с англ), и там нечего не скачать. Мне проще если это будет скрипт.
ТОГДА ДЛЯ ВАС ПРОЩЕ
nircmd
хотя что там трудного ложишь C:\Program Files\AutoHotkey\Lib\VA.ahk
скинуть на почту могу
ТОГДА ДЛЯ ВАС ПРОЩЕ
nircmd
Нет не будет, я не имею понятия что это.
Давайте почту
~Capslock::
a := VA_GetMasterVolume(1)
b := (a/2)
VA_SetMasterVolume(b, , 1)
KeyWait, Capslock
VA_SetMasterVolume(a, , 1)
return
отправил
Насколько я понял в Vista Audio Control Function Reference нет усиление микрофона, я нашел вот это Automatic microphone boost, но я нечего там не понял, может кто нибудь помочь?)
nircmd, это первая ссылка в гугле http://www.nirsoft.net/utils/nircmd.html чтобы скачать нужно покрутить колесико мыши когда будет конец страницы, будут ссылки внизу для скачивания "Download NirCmd" в архиве будет nircmd.exe на нём нажать 2 раза левой кнопкой мыши , нажать copy to windows , нажать ок, NirCmd.chm это справка
В справке nircmd нажать ктрл F набрать setvolume покурить ниже, я тоже инглиш не шпрехаю совсем, но там уж очень просто.
у меня уровня усиления нет просто вкл \ выкл , есть уровень записи или не знаю как его назвать, меняет это
Run, C:\Windows\nircmd.exe setsysvolume 25000 default_record
25000 из 65535 чтоб с расчётом не парится тоже самое
a:=655.35*50 ; 50 - нужный процент
Run nircmd.exe setsysvolume %a% default_record
посмотреть устройства если нужно, хотя у меня на русском всё выдал, врядли это можно использовать, хотя не проверял
Run, C:\Windows\nircmd.exe showsounddevices wait 1000
setsysvolume устанавливает значение в..
changesysvolume меняет значение на...
mutesysvolume
Даже для отдельных приложений есть команды setappvolume changeappvolume
посмотреть устройства если нужно, хотя у меня на русском всё выдал, врядли это можно использовать, хотя не проверял
попробовал, можно с кавычками и без
Забыл что можно без C:\Windows\ , и чтоб колёсико немелькало
Run, %comspec% /c nircmd.exe changesysvolume 555 Динамики, , hide
Насколько я понял в Vista Audio Control Function Reference нет усиление микрофона, я нашел вот это Automatic microphone boost, но я нечего там не понял, может кто нибудь помочь?)
VA_SetMasterVolume(50, Микрофон, 2)
справка оффлайн http://files.mail.ru/BDZK9R
Насколько я понял в Vista Audio Control Function Reference нет усиление микрофона, я нашел вот это Automatic microphone boost, но я нечего там не понял, может кто нибудь помочь?)
VA_SetMasterVolume(50, Микрофон, 2)
справка оффлайн http://files.mail.ru/BDZK9R
Мне нужно именно усиление микрофона, а не чувствительность.
Может проще тогда скрипт на перезагрузку звуковой карты, если весь смысл усиление микрофона чтою убрать глюк.
Может проще тогда скрипт на перезагрузку звуковой карты, если весь смысл усиление микрофона чтою убрать глюк.
Глюк убирается только путем изменения уровня усиленя микрофона, и сам глюк появляется при каждой загрузке компа или простое. Похоже на кривые дрова, но они с офф сайта, а там так и не пофиксили, т.е. при загрузке усиление микрофона читается с дров, а его уровень нет. (или как это происходит я не знаю, но по моей догадке так)
@1st Запустите скрипт для анализа звуковой карты, и выложите картинку окна с результатом.
@1st Запустите скрипт для анализа звуковой карты, и выложите картинку окна с результатом.
1st
Какая звуковая карта?
У меня дело с усилением обстоит по другому:
Control Type не Mute, а OnOff. В свойствах самого микрофона это чекбокс а не слайдер:
И вот такой код на него воздействует (правда бывает скрипт виснет после нескольких нажатий):
Space::
SoundGet, IsState, Microphone, OnOff
SoundSet, % IsState="On" ? 0:1, Microphone, OnOff
TrayTip,, % "boost: is "(IsState="Off" ? "en":"dis")"able"
KeyWait, % A_ThisHotkey
Return
Если выставить режим совместимости в свойствах самого интерпретатора:
То код на анализ, выдаёт несколько другие результаты.
1st
Какая звуковая карта?
Встроенная Asus P7P55D Deluxe
видимо проще сделать скрипт - запустил окно где нибудь подальше х5555 у5555, чтоб не мелькало-подёргал ползунок-закрыл
у меня так на ASUS Xonar DG Audio для переключения с ушей на колонки с переменой уровней громкости в микшере, по другому никак.
чтоб дёргать без мыши тем более в окне за пределами раб стола юзай
нажать
ControlClick, x115 y174, Xonar DG Audio Center,,,, Pos
дёргать
ControlClick, d x115 y174, Xonar DG Audio Center,,,, Pos
ControlClick, u x115 y134, Xonar DG Audio Center,,,, Pos
кстати стоит в авто загрузке, так как при старте включены всегда наушники
видимо проще сделать скрипт - запустил окно где нибудь подальше х5555 у5555, чтоб не мелькало-подёргал ползунок-закрыл
у меня так на ASUS Xonar DG Audio для переключения с ушей на колонки с переменой уровней громкости в микшере, по другому никак.
чтоб дёргать без мыши тем более в окне за пределами раб стола юзай
нажать
ControlClick, x115 y174, Xonar DG Audio Center,,,, Pos
дёргать
ControlClick, x115 y174, Xonar DG Audio Center,,,, D Pos
ControlClick, x115 y134, Xonar DG Audio Center,,,, U Posкстати стоит в авто загрузке, так как при старте включены всегда наушники
Извини я не чего не понял.
Видимо я не понял, тебе важно свою траблу решить, или необходимо решить её только через API ?
скрипт пускает окно где усиление, дергаёт туда сюда ползунок что снимает твой вопрос, закрывает окно.
А возможно сделать тоже самое, но с уровнем усилением микрофона? Дело в том что у меня глючит звуковуха и после перезагрузки или просто иногда при работе компа, выключается "усиление микрофона", но немного непонятно потому что когда открываешь свойства микрофона во вкладке "уровни" усиление ползунок стоит всегда на +20, но усиление не работает, а чтобы заработало я двигаю ползунок на +30 и обратно на +20 и тогда оно включается снова, вот эту функцию мне бы хотелось перенести на горячею клавишу.
Gosub, что я не понял
if нужно чтоб это было так, что ничего не видно и не активируется
break
else
if тебе это нужно, но ты не понял из моего текста того как это сделать
break
if тебе нужно не это, а нужно то, чего я не понял
ExitApp
Хотя я думаю что ребут её поможет, ты пробовал?
У тебя нет сейчас варианта, через встроенные переменные определения\воздействия, влиять на нужный параметр твоей ЗК.
Почему не сделать просто макрос?
if тебе это нужно, но ты не понял из моего текста того как это сделать
Это )
Я не знаю CLSID Управление звуковыми устройствами потому создаёш папку
GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
из неё создаёш ярлык на Управление звуковыми устройствами указываеш его запуск, дальше сам поймёш. Естественно координаты свои ставь. AU3_SPY.exe я думаю знаешь что такое.
f1::
Run D:\AutoIt\Управление звуковыми устройствами - Ярлык.lnk
WinWait Звук
WinMove 0, 0 ; перемещаешь окно, можно и запределы эрана
ControlClick, x163 y62, Звук,,,, Pos ; жмёшь запись
Sleep, 100
ControlClick, x133 y147, Звук,,,, Pos ; выделяешь свой микрофон
ControlClick, x400 y509, Звук,,,, Pos ; жмёшь свойства
Sleep, 100
ControlClick, x184 y57, Свойства: Микрофон,,,, Pos ; жмёшь усиление
Sleep, 100
ControlClick, x150 y133, Свойства: Микрофон,,,, Pos ; жмёшь слева от ползунка
Sleep, 100
ControlClick, x220 y133, Свойства: Микрофон,,,, Pos ; жмёшь справа от ползунка, т.е. возвращаешь обратно
Sleep, 100
ControlClick, ОК, Свойства: Микрофон ; жмёшь ОК
WinClose Звук
Return
---
Кстати знающие люди подскажите как узнавать CLSID окон, ну типа
Run ::{645ff040-5081-101b-9f08-00aa002f954e} ; Открывает Корзину
Спасибо, думал что такое есть для всех окон винды
Макрос кликанья я могу сделать, я думал можно сделать это скриптом, но если нет, тогда я не понял одного как мне открыть командой в скрипте окно "Свойства: Line In/Mic In", желательно с активной вкладкой "Уровни", все что я нашел это такая команда
control mmsys.cpl,,1
только для windows 7, но это окно "звук" с вкладкой "запись".
control mmsys.cpl,,1 - это находка!
я думал можно сделать это скриптом
разве это не скрипт?
но если нет, тогда я не понял одного как мне открыть командой в скрипте окно "Свойства: Line In/Mic In", желательно с активной вкладкой "Уровни
Кликать куда надо занимает не дольше 400 мс. Не понимаю в чем проблема. Видимо всё таки
или необходимо решить её только через API ?
control mmsys.cpl,,1
странно, у меня это открывает вкладку "Воспроизведение"
control mmsys.cpl,,1
странно, у меня это открывает вкладку "Воспроизведение"
только для windows 7, но это окно "звук" с вкладкой "запись".
Я просто подумал что имелось ввиду сразу открывается вкладку запись
Ссылка хорошая, спасибо.
_____
И всё же, чего нужно добится?
только для windows 7, но это окно "звук" с вкладкой "запись".
Я просто подумал что имелось ввиду сразу открывается вкладку запись
Ссылка хорошая, спасибо.
Так и есть.
_____
И всё же, чего нужно добится?
Как открыть через AHK окно "Свойства: Line In/Mic In" (Свойства Микрофона) в windows 7
Как открыть через AHK окно "Свойства: Line In/Mic In" (Свойства Микрофона) в windows 7
Я думаю, но могу конечно заблуждатся, что никак. Окно "звук" встроено в винду, а вот твоё окно Line In/Mic In зависимо, т.е. если нет в системе Line In/Mic In, а есть к примеру Лин. вход как у меня, или Line In/Mic In отключен, то окна Line In/Mic In несуществует. Поэтому только щёлкать по вкладкам.
у меня это регулирует
VA_SetMasterVolume(50, , "Лин. вход")
попробуй просто
VA_SetMasterVolume(50, "Усиление микрофона", "Mic In")
VA_SetMasterVolume(50, , "Усиление микрофона")
открой окно "Свойства: Line In/Mic In" и эксперементируй
может кто то еще подскажет
; отладка
SetKeyDelay, 250
Space::
Run, % "rundll32.exe Shell32.dll,"
. "Control_RunDLL mmsys.cpl,,recording",,, PID
WinWait, % "ahk_pid" PID,, 1
If !ErrorLevel
{
Send, {Down}
Sleep, 500
ControlClick, Button3, ahk_class #32770,,, 2
Sleep, 500
Send, {CtrlDown}{Tab 2}{CtrlUp}
Sleep, 500
ControlSend, msctls_trackbar322
, {Left}{Right}
, ahk_class #32770
Sleep, 500
Process, Close, % PID
KeyWait, % A_ThisHotkey
Return
}
MsgBox, 262192, % " ", % "Epic fail", 1
KeyWait, % A_ThisHotkey
Return
; итоговый
SetKeyDelay, 25
Space::
Run, % "rundll32.exe Shell32.dll,"
. "Control_RunDLL mmsys.cpl,,recording",,, PID
WinWait, % "ahk_pid" PID,, 1
If !ErrorLevel
{
Send, {Down}
ControlClick, Button3, ahk_class #32770,,, 2
Send, {CtrlDown}{Tab 2}{CtrlUp}
ControlSend, msctls_trackbar322
, {Left}{Right}
, ahk_class #32770
Process, Close, % PID
KeyWait, % A_ThisHotkey
Return
}
MsgBox, 262192, % " ", % "Epic fail", 1
KeyWait, % A_ThisHotkey
Return
Спасибо огромное!
Process, Close, % PID
А изменения сохраняются? Надо наверно чтобы ОК нажимался.
По Вашему я делаю, что-либо необдуманно?, там и изменения сохраняются, и окна на Escape закрываются...
По Вашему я делаю, что-либо необдуманно?, там и изменения сохраняются, и окна на Escape закрываются...
Извините, я спросил чтобы знать.
Регулировка баланса громкости в микшере для отдельных приложений
(Функция VA_AppVolume)
Step := 10
CapsLock & WheelDown:: AppVolume("Vol", -Step)
CapsLock & WheelUp:: AppVolume("Vol", +Step)
CapsLock & MButton:: AppVolume("Mute", 2)
AppVolume(Key, Val) {
WinGet, Pid, PID, A
WinGet, Title, ProcessName, ahk_pid %Pid%
if Title = explorer.exe
Pid := 0 , Title := "Системные звуки"
Res := VA_AppVolume(Key, Val, Pid)
if Res =
Res := "Отсутствует в микшере громкости", Key := ""
Res := (Key = "Mute") ? (Res = 0 ? "Mute OFF": "Mute ON") : Res
TrayTip, % Title, % Res, 1, 1
}
Launch_Mail:: ExclusiveAppVolume()
ExclusiveAppVolume() {
Static T, PrPid
WinGet, Pid, PID, A
WinGet, ProcessName, ProcessName, ahk_pid %Pid%
ProcessName := RTrim( ProcessName, "\.exe")
StringUpper, ProcessName, ProcessName
if ProcessName = explorer
Pid := 0 , ProcessName := "Системные звуки"
ListPid := 0 "|" VA_AppVolume("ListPid")
ListPid := RTrim( RegExReplace( ListPid, "S)(^|\|)" Pid "($|\|)", "$1", Count, 1), "|")
If !Count
Return
T := PrPid = Pid ? !T : 1
PrPid := Pid
Loop, parse, ListPid, |
VA_AppVolume("Mute", T, A_LoopField)
VA_AppVolume("Mute", 0, Pid)
TrayTip, Exclusive app sound , % "`n" (T ? "Только """ ProcessName """" : "Все звуки включены") , 1, % T ? 3 : 2
}
------------------------------
; Requirements:
; VA 2.1 - http://www.autohotkey.com/forum/topic23792.html
; https://dl.dropbox.com/u/20532918/Lib/VA-2.2.zip DownLoad - VA-2.2.zip
; Windows 7
; AutoHotkey_L
;
; Currently not included in VA.ahk
;
; Post Lexikos - http://www.autohotkey.com/board/topic/78224-possible-to-monitor-and-pseudo-lock-per-app-volume/#entry497079
;
; VA_AppVolume
VA_AppVolume(Key, Val = "", Pid = "!")
{
dev := VA_GetDevice()
if !dev
Return
if VA_IMMDevice_Activate(dev, "{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}", 7, 0, mgr) != 0 ; IID_IAudioSessionManager2
Return ObjRelease(dev)
ObjRelease(dev)
if VA_IAudioSessionManager2_GetSessionEnumerator(mgr, enm) != 0
Return ObjRelease(mgr)
ObjRelease(mgr)
VA_IAudioSessionEnumerator_GetCount(enm, count)
Loop % count
{
VA_IAudioSessionEnumerator_GetSession(enm, A_Index-1, ssn)
VA_IAudioSessionControl2_GetProcessId(ssn, curpid)
if (Pid = curpid)
{
sav := ComObjQuery(ssn, "{87CE5498-68D6-44E5-9215-6DA47EF883D8}") ; IID_ISimpleAudioVolume
ObjRelease(ssn)
if !sav
Return
DllCall(NumGet(NumGet(sav+0)+6*A_PtrSize), "uint", sav, "int*", mute) ; GetMute
if (Key = "Vol")
{
DllCall(NumGet(NumGet(sav+0)+4*A_PtrSize), "uint", sav, "float*", volume) ; GetVolume
if mute = 1
DllCall(NumGet(NumGet(sav+0)+5*A_PtrSize), "uint", sav, "int", 0) ; SetMute
vol := (volume + Val / 100)
vol := (vol > 1) ? 1 : (vol < 0) ? 0 : vol
DllCall(NumGet(NumGet(sav+0)+3*A_PtrSize), "uint", sav, "float", vol) ; SetVolume
Return Round(vol*100), ObjRelease(sav), ObjRelease(enm)
}
if (Key = "Mute")
{
if (Val = "Get")
Return mute, ObjRelease(sav), ObjRelease(enm)
DllCall(NumGet(NumGet(sav+0)+5*A_PtrSize), "uint", sav, "int", mute := (Val = 2) ? !mute : Val) ; SetMute
Return mute, ObjRelease(sav), ObjRelease(enm)
}
if (Key = "SetVol")
{
if mute = 1
DllCall(NumGet(NumGet(sav+0)+5*A_PtrSize), "uint", sav, "int", 0) ; SetMute
DllCall(NumGet(NumGet(sav+0)+3*A_PtrSize), "uint", sav, "float", Val / 100) ; SetVolume
Return Val, ObjRelease(sav), ObjRelease(enm)
}
if (Key = "GetVol")
{
DllCall(NumGet(NumGet(sav+0)+4*A_PtrSize), "uint", sav, "float*", volume) ; GetVolume
Return Round(volume*100), ObjRelease(sav), ObjRelease(enm)
}
}
ObjRelease(ssn)
ListPid .= curpid "|"
}
ObjRelease(enm)
if (Key = "ListPid")
{
Loop, parse, ListPid, |
List .= (WinExist("ahk_pid " A_LoopField) ? A_LoopField "|" : "")
Return RTrim( List, "|")
}
}
Функцию "VA_AppVolume" можно просто добавить в библиотеку "VA".
------------------------------
Приложенный файл - библиотека VA-2.2 с добавленной функцией VA_AppVolume.
Кто-нибудь озадачивался вопросом снятия уровня (в условных единицах), например, стерео микшера? Не уровень регулировки, а именно уровень сигнала, по типу того что выдает в графическом виде VU meter и другие подобные программы?
Мне нужно запрограммировать наличие или отсутствие звука, но с VA пока не разобрался, т.к. достаточно объемная библиотека.
ОС Win 7 x64.
Спасибо большое! Лаконично и по делу))
У меня есть два источника звука в системе - два плеера (два instance одной программы). Мне необходимо определить из какого есть звук, из какого нет.
За исходный код взят
#Persistent
audioMeter := VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VarSetCapacity(peakValues, channelCount*4)
SetTimer, GetPeakValues, 100
return
GetPeakValues:
VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
loop %channelCount%
ToolTip %v%
until v := NumGet(peakValues, A_Index*4-4, "float")
return
Аргумент A_Index*4-4 в строке может принимать значения 0,4,8,12 и т.д. для своей системы опытным путем выяснил, что аргумент равен 4.
v := NumGet(peakValues, A_Index*4-4, "float")
Поступаю следующим образом - измеряемый источник в нормальном состоянии, второй mute. Запускаю функцию, которая делает 5 замеров с интервалом в 150 мс и суммирует полученные значения, по результатам делаю вывод звук есть/нет.
Если выключить оба источника сразу, отрабатывает нормально
Если включить оба сразу, так же срабатывает адекватно.
НО если включить один, сделать mute (ползунком громкости или клавишей mute не важно) на второй.. все равно считываемое значение больше "нуля", т.е. получается будто сигнал есть. Если закрыть одну из программ, то отрабатывает правильно, реагирует на громкость. Дополнительно контролировал по графическому отображению уровней сигналов в микшере записывающих устройств Windows - Алгоритмически все работает правильно, mute одного из источников действительно оставляет уровень другого.
Уже пробовал разные варианты - увеличивал интервалы между считыванием уровня громкости (например если mute у плеера происходит не мгновенно, а постепенно), запускал внутри функции проверки, или делал несколько вызовов функции, не получается ни в том ни в другом случае.
Я не силен в программинге под Win, но складывается такое ощущение, что либо я считываю не тот участок памяти, либо после mute одного из них, уровень на самом деле не изменяется, остается в памяти от второго приложения. Либо это заморочки с тем, что это две копии одного приложения ( хотя работают независимо друг от друга, проверено).
Поэтому вопросов два - первый по этой проблеме, второй можно ли каким-то образом узнать уровень звукового сигнала, генерируемого определенным окном?
Если не получится решить так, придется делать обработчик через анализ графики программы типа VU Meter, что ооочень бы не хотелось делать.
soundTestMux(MuxNumber)
{
audioMeter := VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VarSetCapacity(peakValues, channelCount*4)
VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
if MuxNumber = 1
{
soundTestMuxVar:= false
soundLevel := 0
measureCount := 0
if !Mux2isMuted
muteMux2()
NumGet(peakValues, 4, "float")
while measureCount <5
{
v := NumGet(peakValues, 4, "float")
soundLevel := soundLevel + v
Sleep, 150
measureCount++
}
ToolTip, Mux 1 %soundLevel%
if (soundLevel > 0.000153)
{
if Mux2isMuted
muteMux2()
soundTestMuxVar := true
}
else
{
soundTestMuxVar := false
if Mux2isMuted
muteMux2()
}
Tooltip, RESULT MUX1 %soundTestMuxVar%
}
}
Насколько я знаю VA.ahk не умеет контролировать уровни приложений - только уровни устройств.
Если не получится решить так, придется делать обработчик через анализ графики программы типа VU Meter, что ооочень бы не хотелось делать.
Необязательно через графику можно найти другой путь. Например, если в названии (или в "контролле") окна меняется время или вроде того.
Насколько я знаю VA.ahk не умеет контролировать уровни приложений - только уровни устройств.
emmetoya пишет:Если не получится решить так, придется делать обработчик через анализ графики программы типа VU Meter, что ооочень бы не хотелось делать.
Необязательно через графику можно найти другой путь. Например, если в названии (или в "контролле") окна меняется время или вроде того.
Пробовал через WinGetText, но подходящего графического с текстовым дублированием не встретил.
Вообще сегодня добил эту тему.. в итоге оказалось что сами значения снимаются правильно, неправильно отрабатывал mute. Но сколько это стоило сил и времени...
Я на пример использую бесплатное приложение "Volume2 " . Очень удобно и много функций.
Вот - кому интересно http://www.softportal.com/software-18603-volume2.html
Заметил такой факт - при Mute уровень звука меняется не скачкообразно, а плавно примерно за 500-600 мс. Для моих задач это весьма большая пауза "на ровном месте". Причем такое поведение не только в используемом стороннем софте, а в любых приложениях, видимо это чисто виндовая тема. Подскажите как это побороть, или это никак не исправить?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться