Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Проблема с активацией микшера Windows

Ответить
Настройки темы
VBS/WSH/JS - Проблема с активацией микшера Windows

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt Volume_and_Alarm_clock1 - полный пример.txt
(4.3 Kb, 9 просмотров)
Добрый день, помогите дописать код будильника.
В скрипте реализован запуск аудиофайла с последовательной регулировкой в цикле громкости системы через 50 сек. (сброс до нуля) и через следующие 10 сек. (увеличение). И так до завершения воспроизведения трека. Появилась необходимость прописать сброс контекстных меню, которые я сам вызываю ПКМ, когда он (этот чёртов будильник) будит меня ( ), т.к. при их наличии микшер активируется, но громкость не регулируется.
Что найдено на данный момент. Решено пойти по пути сброса всех окон или выполнить нажатие ЛКМ, таким образом убрать вызванное меню. Насколько я понял, язык VBS сам не умеет эмулировать клик по кнопкам мыши, поэтому было найдено решение применить приложение Excel через объект и использовать его в попытке переместить курсор в нужное место и там кликнуть по ЛКМ, тем самым решить проблему. Но вот беда, в первой части повторения в цикле микшер успешно понижает громкость, а после эмуляции клика, микшер вызывается, но не активируется.

Вот проблемный кусок кода (полный скрипт прикреплю в файле):
Код: Выделить весь код
Set obj_sh = CreateObject("WScript.Shell")
pause = 100
wmp_vol = 70
WScript.Sleep pause
With obj_sh
    For iter_cycl = 1 to 1
        WScript.Sleep 5000
        Set volmix = .Exec("%SystemRoot%\System32\SndVol.exe")
        .AppActivate "Volume Mixer"
        WScript.Sleep pause
        For vol_cycl = 1 to iter_cycl + 1
            .SendKeys "{PGDN}"
        Next
        WScript.Sleep pause
        volmix.Terminate
        Set volmix = Nothing
        WScript.Sleep 1000
'------------------------
Set object = CreateObject("shell.application")
object.MinimizeAll
Set object = Nothing
On Error Resume Next
Set excel = WScript.CreateObject("Excel.Application")
x = "0" 
y = "0" 
excel.ExecuteExcel4Macro ("CALL(""user32"",""SetCursorPos"",""JJJ""," & x & "," & y & ")")
excel.ExecuteExcel4Macro ("CALL(""User32"",""mouse_event"",""JJJJJJ""," & "2" & ")")
WScript.Sleep pause
excel.ExecuteExcel4Macro ("CALL(""User32"",""mouse_event"",""JJJJJJ""," & "4" & ")")
WScript.Sleep pause
Set excel = Nothing
On Error GoTo 0
'--------------------------
        Set volmix = .Exec("%SystemRoot%\System32\SndVol.exe")
        .AppActivate "Volume Mixer"
        WScript.Sleep pause
        For vol_cycl = 1 to iter_cycl + 1
            .SendKeys "{PGUP}"
        Next
        WScript.Sleep pause
        volmix.Terminate
        Set volmix = Nothing
    Next
End With
Set obj_sh = Nothing
А может имеется более лаконичное решение? Спасибо.

Отправлено: 12:22, 05-04-2020

 

Старожил


Сообщения: 352
Благодарности: 193

Профиль | Отправить PM | Цитировать


Для изменения громкости можно эмулировать нажатия мультимедийных клавиш:
Код: Выделить весь код
' Увеличить громкость:
obj_sh.SendKeys(chr(&hAF))

' Уменьшить громкость:
obj_sh.SendKeys(chr(&hAE))
Можно использовать команды setsysvolume и changesysvolume утилиты nircmd через метод Run.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:18, 05-04-2020 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Сергей Красиков, не тот язык выбрали.

Например, на AutoIt:
Скрытый текст
Код: Выделить весь код
#include <Sound.au3>

AutoItSetOption("MustDeclareVars", 1)

Local $sFileName = @ScriptDir & "\Default.mp3"
Local $aSound    = _SoundOpen($sFileName)
Local $i

If @error = 2 Then
    MsgBox($MB_SYSTEMMODAL, "Error", "The file does not exist")
    Exit(1)
ElseIf @extended <> 0 Then
    Local $iExtended = @extended ; Assign because @extended will be set after DllStructCreate().
    Local $tText = DllStructCreate("char[128]")
    DllCall("winmm.dll", "short", "mciGetErrorStringA", "str", $iExtended, "struct*", $tText, "int", 128)
    MsgBox($MB_SYSTEMMODAL, "Error", "The open failed." & @CRLF & "Error Number: " & $iExtended & @CRLF & "Error Description: " & DllStructGetData($tText, 1) & @CRLF & "Please Note: The sound may still play correctly.")
	Exit(2)
EndIf

Local $iSoundLength = _SoundLength($aSound, 2)
Local $iPercent

SoundSetWaveVolume(5)
_SoundPlay($aSound)
ProgressOn($sFileName, "Volume level: ", "Current playing position: 0%", -1, -1, 16)

While 1
	For $i = 5 To 100
		SoundSetWaveVolume($i)
		$iPercent = Round(_SoundPos($aSound, 2) / $iSoundLength * 100, 1)
		ProgressSet($iPercent, "Current playing position: " & $iPercent & "%", "Volume level: " & $i & "%")
		Sleep(100)

		If _SoundPos($aSound, 2) >= $iSoundLength Then
			ExitLoop 2
		EndIf
	Next

	For $i = 100 To 5 Step -1
		SoundSetWaveVolume($i)
		$iPercent = Round(_SoundPos($aSound, 2) / $iSoundLength * 100, 1)
		ProgressSet($iPercent, "Current playing position: " & $iPercent & "%", "Volume level: " & $i & "%")
		Sleep(100)

		If _SoundPos($aSound, 2) >= $iSoundLength Then
			ExitLoop 2
		EndIf
	Next

WEnd

ProgressSet(100, "Current playing position: 100%", "Volume level: 100%")

SoundSetWaveVolume(100)
_SoundStop($aSound)
_SoundClose($aSound)

ProgressOff()

Exit(0)
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:26, 05-04-2020 | #3


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, я относительно неплохо знаком с VBA, поэтому VBS освоить легче. Сейчас огромными глазами смотрю на приведённый вами пример, как когда-то на Бейсик. Не, в другой раз.
iglezz, Спасибо. То, что надо!
Код: Выделить весь код
Set obj_sh = CreateObject("WScript.Shell")

pause = 200

With obj_sh

    i = 0
    While i < 51
'Уменьшить громкость:
        .SendKeys(chr(&hAE))
        i = i + 1
    Wend

    WScript.Sleep pause * 5

    i = 0
    While i < 10
'Увеличить громкость:
        .SendKeys(chr(&hAF))
        i = i + 1
    Wend

End With

Set obj_sh = Nothing

Таким образом удастся избавиться от сторонних приложений, чего не хотелось делать и с nircmd.

Друзья, спасибо за ответы!

Отправлено: 17:49, 05-04-2020 | #4


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Сергей Красиков, а там разницы не особо. Между VBA/WSH и AutoIt.

Отправлено: 18:04, 05-04-2020 | #5


Старожил


Сообщения: 352
Благодарности: 193

Профиль | Отправить PM | Цитировать


Сергей Красиков,
Autoit - бейсико-подобный язык, переехать на него с VBS несложно. И для целей мелкого бытового скриптинга подходит в целом лучше - в комплекте GUI, тонна пользовательских функций, адекватная справка с примерами.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:09, 05-04-2020 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Проблема с активацией микшера Windows

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Проблема с активацией windows 7 Lich130387 Microsoft Windows 7 1 11-07-2015 16:16
Разное - Проблема с активацией windows osobolev Microsoft Windows 8 и 8.1 15 13-04-2015 17:19
Разное - [решено] Проблема с активацией Windows 7 Птушвиче Microsoft Windows 7 1 17-03-2014 09:15
Разное - Проблема с активацией impulse101 Microsoft Windows 7 3 27-03-2012 19:05
Службы - [решено] Проблема с активацией windows 7 antikiller_bm Microsoft Windows 7 3 21-11-2009 13:53




 
Переход