Что нового

Определить громкость звука от конкретного приложения

Heavenanvil

Новичок
Сообщения
21
Репутация
0
Здравствуйте, уважаемые форумчане русского сообщества autoit.

Перейду сразу к делу. В среде Windows XP есть одно приложение, допустим аудиоплеер, который вещает музыку 24/7.
Иногда случается так, что после перезагрузки компа аудиоплеер запускается, начинает воспроизводить музыку, но по факту музыки нет, то есть на выходе звуковой карты аудиопоток не идёт, хотя ползунок бегает и всё отображается правильно. Пока вручную не остановишь и не запустишь воспроизведение, либо не перезапустишь плеер (его процесс), звука не будет.
К сожалению заменить плеер не представляется возможным, поскольку это узкоспециализированный забугорный софт.
Мне нужно с помощью autoit каким-то образом определить есть ли на выходе у этого приложения звук, и если его не будет в течении нескольких секунд, допустим 30, то перезапустить процесс.
Это возможно сделать?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Heavenanvil
Получается проблема софта и нужно делать автоматизацию приложения. В WinXP нет регуляторов приложений, кроме как регулятор в самом приложении.
 
Автор
Heavenanvil

Heavenanvil

Новичок
Сообщения
21
Репутация
0
AZJIO сказал(а):
Heavenanvil
Получается проблема софта и нужно делать автоматизацию приложения. В WinXP нет регуляторов приложений, кроме как регулятор в самом приложении.
Что значит "нужно делать автоматизацию приложения"?
Может есть какие-то альтернативные методы решения проблемы?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Heavenanvil [?]
Что значит "нужно делать автоматизацию приложения"?
получить дескриптор окна, дескриптор регулятора, передать значение регулятору, чтобы он переместился и звук появился.
 
Автор
Heavenanvil

Heavenanvil

Новичок
Сообщения
21
Репутация
0
Так в том то и дело, приложение "думает" что вещает правильно, а по факту нет. Поэтому брать данные у него вероятно нет смысла.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Heavenanvil
а зачем знание о том что думает программа? Цель то из вопроса выше заставить прогу при запуске гарантировать звук вне зависимости что об этом думает программа. И решение как это гарантировать тоже вроде описано, или нет?
Пока вручную не остановишь и не запустишь воспроизведение
вот эти слова... решение, остаётся сделать это программно...
 
Автор
Heavenanvil

Heavenanvil

Новичок
Сообщения
21
Репутация
0
От ваших слов у меня шары на лоб))
Такое правда можно сделать!?)
Не просто навести курсор и нажать на кнопку, а прям нажать программно?
Как вообще работать с этими дескрипторами окон?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Heavenanvil
Код:
ControlClick

нажми, чтобы перейти к описанию функции
 
Автор
Heavenanvil

Heavenanvil

Новичок
Сообщения
21
Репутация
0
Допустим у меня получится нажать на "Stop", а затем на "Play" в окне программы вещания, чтобы всё заработало. Хотя можно обойтись просто перезапуском процесса.
Но как мне определить, что именно сейчас нужно нажать? Основная проблема ведь состоит в том, чтобы определить играет или не играет, а потом уже предпринимать действия.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Heavenanvil [?]
Основная проблема ведь состоит в том, чтобы определить играет или не играет, а потом уже предпринимать действия.
А производить это действие постоянно, чтобы было наверняка - не вариант? Или это как то мешает?
 
Автор
Heavenanvil

Heavenanvil

Новичок
Сообщения
21
Репутация
0
Постоянно нажимать на "Stop" / "Play"?
Нет, это не вариант. Совсем не вариант.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Heavenanvil
Какова причина пропадания звука? В момент запуска из сна? в момент переключения трека? Не может же само собой перестать, что-то должно произойти перед пропаданием... память закончилась? В общем сделать слежку за параметром, который влияет на пропадание звука. Проверять уровнем сигнала - может быть есть в Bass.dll, попробуй поискать "bass.dll уровень выходного сигнала"
 
Автор
Heavenanvil

Heavenanvil

Новичок
Сообщения
21
Репутация
0
Сама причина пропадания звука мне неизвестна, но случается это в основном после перезагрузки пк.
То есть комп перезагружается, запускается Windows, запускается программа вещания и включает это самое вещание. Но не всегда видимо корректно включает.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Heavenanvil [?]
То есть комп перезагружается, запускается Windows, запускается программа вещания и включает это самое вещание. Но не всегда видимо корректно включает.
Может просто есть смысл запускать программу вещания с задержкой, пока система загрузится полностью?
 

Diamond

Меценат
Меценат
Сообщения
15
Репутация
1
Мне нужно с помощью autoit каким-то образом определить есть ли на выходе у этого приложения звук
Попробуйте узнать с какими параметрами запускается процесс, возможно это как-то поможет прояснить причину ошибки.

Код:
ConsoleWrite( _ProcessGetCommandLine("MyProcess.exe") & @LF)

Func _ProcessGetCommandLine($vProcessName, $fPID = False)
	Local $sCommandLine, $o
	Local $objService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
	If @error Then Return SetError(1)
	Local $QueryText = "SELECT * FROM Win32_Process WHERE  " & ($fPID?"ProcessId":"name") & " LIKE '" & $vProcessName & "'"
	Local $colProcess = $objService.ExecQuery($QueryText)
	For $o In $colProcess
		$sCommandLine &= $o.CommandLine() & @LF
	Next
	Return $sCommandLine
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Heavenanvil [?]
но случается это в основном после перезагрузки пк
Как было сказано выше попробовать задержку автозапуска до 3 минут. Попробовать отключить быструю загрузку (fastboot). Ну и решение то вот оно, зачем проверять что-то каждую секунду, когда можно запустить скрипт из автозагрузки, который запустит приложение, дождётся его запуска сделает задержку пару сек и пару раз кликнет на кнопку.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Heavenanvil
Так как тебе будет сложно составить код, если придётся, то вот примерный вариант, только вместо "AkelPad.exe" укажешь свой путь, вместо класса AkelPad4 узнай класс используя Au3Info.exe, также класс кнопки вместо AkelEditW1 узнай тем же Au3Info.exe и далее тестируй.
Код:
; Запуск AkelPad
Run('C:\Program Files\AkelPad\AkelPad.exe')
; Run('C:\Program Files\AkelPad\AkelPad64.exe')

; Ожидание максимум 5 секунд до момента, когда оно станет существующим
$hWnd = WinWait("[CLASS:AkelPad4]", "", 5) ; без таймаута (5) ожидание бесконечно
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf

; Ожидание 1 секунды чтобы прогрузить интерфей проги, иначе следующие команды отправятся в пустоту. Если AkelPad открыт, то задержка не нужна.
Sleep(1000)

$hEdit = ControlGetHandle($hWnd, "", "AkelEditW1")
If Not $hEdit Then
    MsgBox(4096, 'Сообщение', 'Окно редактирования не найдено, завершаем работу скрипта')
    Exit
EndIf

ControlClick($hWnd, "", $hEdit)
Sleep(300)
ControlClick($hWnd, "", $hEdit)
 
Автор
Heavenanvil

Heavenanvil

Новичок
Сообщения
21
Репутация
0
Вот за это отдельное персональное человеческое спасибо!)
 
Верх