Нужен скрипт : уменьшение громкости при выключении.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
bdfy
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.01.2004 (Вс) 19:16

Нужен скрипт : уменьшение громкости при выключении.

Сообщение bdfy » 28.01.2004 (Ср) 2:25

Излагаю проблему:
При вкл./выкл компа колонки издают порядочный треск( звук встроенный).Проблема не новая , у многих присутствует , но решения вроде не видно ( на хоботе ветка есть).
Я тут подумал ,а если програмно шменьшать громкость до нуля перед выключением , а другим скриптом в автозагрузке возвращать назад?
Т.е нужно два скрипта:
1) Убрать громкость и выключить компьютер ( вариант презагрузить )
Повешу на рабочий стол и буду юзать вместо пуск- завершение работы
2) Задать необходимый уровень громкости
Выключить комп под ХР не проблема
Код: Выделить всё
set WshShell=WScript.CreateObject ("WScript.Shell")

WshShell.Run "c:\windows\system32\shutdown.exe -s "

Подскажите со звуком, плиз.
ЗЫ: Если кто знает другое решение проблемы , с удовольствием выслушаю ( хотя это будет уже оффтопик , так что вот мыло vadas@yandex.ru )

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 28.01.2004 (Ср) 16:29

полистал я в API-Guide и вот что нашел:
Код: Выделить всё
Declare Function waveOutSetVolume Lib "Winmm" (ByVal wDeviceID As Integer, ByVal dwVolume As Long) As Integer
The waveOutSetVolume function sets the volume level of the specified waveform-audio output device.

· hwo
Handle to an open waveform-audio output device. This parameter can also be a device identifier.

· dwVolume
New volume setting. The low-order word contains the left-channel volume setting, and the high-order word contains the right-channel setting. A value of 0xFFFF represents full volume, and a value of 0x0000 is silence.
If a device does not support both left and right volume control, the low-order word of dwVolume specifies the volume level, and the high-order word is ignored.

Returns MMSYSERR_NOERROR if successful or an error otherwise. Possible error values include the following.
MMSYSERR_INVALHANDLE Specified device handle is invalid.
MMSYSERR_NODRIVER No device driver is present.
MMSYSERR_NOMEM Unable to allocate or lock memory.
MMSYSERR_NOTSUPPORTED Function is not supported.

ну и пример
Код: Выделить всё
'Example submitted by Danjel Nyberg
'It needs a textbox (Text1) and two command buttons (Command1, Command2)
Private Declare Function waveOutSetVolume Lib "Winmm" (ByVal wDeviceID As Integer, ByVal dwVolume As Long) As Integer
Private Declare Function waveOutGetVolume Lib "Winmm" (ByVal wDeviceID As Integer, dwVolume As Long) As Integer
Private Sub Command1_Click()
    Dim a, i As Long
    Dim tmp As String
    a = waveOutGetVolume(0, i)
    tmp = "&h" & Right(Hex$(i), 4)
    Text1 = CLng(tmp)
End Sub
Private Sub Command2_Click()
    Dim a, i As Long
    Dim tmp, vol As String
    vol = Text1
    tmp = Right((Hex$(vol + 65536)), 4)
    vol = CLng("&H" & tmp & tmp)
    a = waveOutSetVolume(0, vol)
End Sub

еще можно через DirectSound регулировать...
щас исходник посмотрю....

примерно 7 минут спустя...
ага, вот нашел маленькую статью про работу с DirectSound
Вложения
dstutor.zip
небольшой туториал по работе с DirectSound
(24.64 Кб) Скачиваний: 87
Последний раз редактировалось Cyrax 28.01.2004 (Ср) 18:19, всего редактировалось 2 раз(а).
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 28.01.2004 (Ср) 16:36

Гениально! Теперь бы вот только API из скрипта вызывать и все будет просто окей :)

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 28.01.2004 (Ср) 16:39

RayShade писал(а):Гениально! Теперь бы вот только API из скрипта вызывать и все будет просто окей :)

ну из скрипта можно маленькую тулзу вызвать
или написать такую тулзу, которая будет глушить звук и после этого гасить тачку :)
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

bdfy
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.01.2004 (Вс) 19:16

Сообщение bdfy » 28.01.2004 (Ср) 18:01

Оговорюсь сразу , что я в ВБ почти полный чайник ( только изучал ВБА в школе и институте , скрипт на выкл. на хоботе подсказали )
Короче создал я скрипт как указал
Cyrax - не работает , ошибка компиляции в строке
Код: Выделить всё
Private Declare Function waveOutSetVolume Lib "Winmm" (ByVal ) wDeviceID As _ Integer, ByVal dwVolume As Long) As Integer

попробуйте у себя пожалуйста и исправьте ошибки.т.е если не сложно дайте проверенный код .
ЗЫ:А как работать вс Windows Script Host не подскажете( может фак есть), по ходу,это ведь должно упрощать создание простейших скриптов?

Чем этот тьюториал открыть можно?Ни опера , ни експлорер ничего толокового не отображают.Ява 2 нужна?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 28.01.2004 (Ср) 18:13

во-первых, где ты енто написал? какой скрипт? надеюсь ты это в VB делаешь...
во-вторых посмотри повнимательней на строку объявления функции: у тебя там закрывающая скобка раньше времени стоит - не должно ее быть после слова ByVal, не должно!
про Windows Script Host - а зачем тебе?... раз уж пошла такая пьянка, то лучше, на мой взгляд, будет сделать все посредством API...
щас поищем код для отключения тачки...

текс... zip про DS заменил... ща буду пример приводить... по выключению компутера... чую после этого мне будет совсем не хорошо
ладно, значит так:
Код: Выделить всё
Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

параметры:
· uFlags
Specifies the type of shutdown. This parameter must be some combination of the following values:
EWX_FORCE
Forces processes to terminate. When this flag is set, Windows does not send the messages WM_QUERYENDSESSION and WM_ENDSESSION to the applications currently running in the system. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
EWX_LOGOFF
Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off.
EWX_POWEROFF
Shuts down the system and turns off the power. The system must support the power-off feature.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.
EWX_REBOOT
Shuts down the system and then restarts the system.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.
EWX_SHUTDOWN
Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.

· dwReserved
Reserved; this parameter is ignored.

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

ну и пример:
для win9x
Код: Выделить всё
'In general section
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Sub Form_Load()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    msg = MsgBox("This program is going to reboot your computer. Press OK to continue or Cancel to stop.", vbCritical + vbOKCancel + 256, App.Title)
    If msg = vbCancel Then End
    'reboot the computer
    ret& = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT, 0)
End Sub

для winNT
Код: Выделить всё
'In a module
Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const ANYSIZE_ARRAY = 1
Private Const VER_PLATFORM_WIN32_NT = 2
Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type
Type LUID
    LowPart As Long
    HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
End Type
Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
'Detect if the program is running under Windows NT
Public Function IsWinNT() As Boolean
    Dim myOS As OSVERSIONINFO
    myOS.dwOSVersionInfoSize = Len(myOS)
    GetVersionEx myOS
    IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function
'set the shut down privilege for the current application
Private Sub EnableShutDown()
    Dim hProc As Long
    Dim hToken As Long
    Dim mLUID As LUID
    Dim mPriv As TOKEN_PRIVILEGES
    Dim mNewPriv As TOKEN_PRIVILEGES
    hProc = GetCurrentProcess()
    OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
    LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
    mPriv.PrivilegeCount = 1
    mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    mPriv.Privileges(0).pLuid = mLUID
    ' enable shutdown privilege for the current application
    AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub
' Shut Down NT
Public Sub ShutDownNT(Force As Boolean)
    Dim ret As Long
    Dim Flags As Long
    Flags = EWX_SHUTDOWN
    If Force Then Flags = Flags + EWX_FORCE
    If IsWinNT Then EnableShutDown
    ExitWindowsEx Flags, 0
End Sub
'Restart NT
Public Sub RebootNT(Force As Boolean)
    Dim ret As Long
    Dim Flags As Long
    Flags = EWX_REBOOT
    If Force Then Flags = Flags + EWX_FORCE
    If IsWinNT Then EnableShutDown
    ExitWindowsEx Flags, 0
End Sub
'Log off the current user
Public Sub LogOffNT(Force As Boolean)
    Dim ret As Long
    Dim Flags As Long
    Flags = EWX_LOGOFF
    If Force Then Flags = Flags + EWX_FORCE
    ExitWindowsEx Flags, 0
End Sub

'In a form
'This project needs a form with three command buttons
Private Sub Command1_Click()
    LogOffNT True
End Sub
Private Sub Command2_Click()
    RebootNT True
End Sub
Private Sub Command3_Click()
    ShutDownNT True
End Sub
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Command1.Caption = "Log Off NT"
    Command2.Caption = "Reboot NT"
    Command3.Caption = "Shutdown NT"
End Sub
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

bdfy
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.01.2004 (Вс) 19:16

Сообщение bdfy » 28.01.2004 (Ср) 20:02

Ну все, щас бить будут...
Пишу в блокноте , сохраняя в формате *.vbs .Получается ВБскрипт .в чем я не прав?:?
про Windows Script Host .Я к чему клоню : в ВБА можно было легко записать макрос ( сервис - макрос - начать запись ), те никаких специальных знаний в простейших случаях не требовалось .Есть что - нить похожее , ламерс-френдли приспособление для создания скриптов ?Мне казалось что это как раз Windows Script Host.
Мой скрипт на выкл. меня вполне устраивает , так что незачем писать страницу кода( ту кстати есть такая ветка ) , в котором я буду полгода разбираться
ЗЫ:если не сложно, проверяй у себя примеры, а то помню на хоботе 3 дня скрипт исправляли ( запуск нескольких приложений - закрытие их )

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 29.01.2004 (Чт) 7:47

все ясно...
да прав был RayShade...
из скрипта ты API-функцию без дополнительных извращение вызвать не сможешь...
а Windows Script Host...
Что такое Windows Script Host?
Для чего же все-таки нужен WSH? WSH позволяет работать с файловой системой, реестром, сетевыми соединениями (диски, принтеры), окружением и др. С помощью wsh-скриптов можно управлять запуском программ, посылать сигналы другим процессам, удаленно администрировать систему, работать с сетевым принтером, управлять входом в систему (login-скрипты) и многое другое. Скрипты для Windows Script Host могут быть не только отдельными программами, но и встраиваться в HTML-страницы, и использоваться в Active Server Pages (ASP), JScript, VBScript или PerlScript

так что тут он тебе скорее всего не помощьник...
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

bdfy
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.01.2004 (Вс) 19:16

Сообщение bdfy » 29.01.2004 (Чт) 18:07

Так что делать то ?Куда обратиться , если я здесь не по адресу?
Или придется все таки ВБ ставить ?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 29.01.2004 (Чт) 18:35

bdfy писал(а):Так что делать то ?Куда обратиться , если я здесь не по адресу?
Или придется все таки ВБ ставить ?

хм... даже и не знаю что ответить-то... :?
можно, конечно, и VB поставить... а можно попробовать поискать еще где-нибудь... а еще можно ;) перед завершением работы выключать колонки, а после этого уже и комп...
или вот еще вариант... :lol:
ставим вместо стандартного регулятора громкости (того, который в винде) алтернативный, у которого есть возможность управления звуком из командной строки
например, ZVolume Pro
или VolumeTray 1.6
может есть и другие, но Яndex рассказал мне только про эти две
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 30.01.2004 (Пт) 19:17

Вопрос, а колонки активные или пассивные.
Если активные то ИМХО бесполезно какой либо код писать, там только ручками громкость убирать придется. :cry: Так как треск это наводки на усилитель колонок. Если под встроеной звуковухой понимается звуковуха с усилителем тогда есть смысл поизвращаться.

(Сунул таки свои пять копеек 8) 8) )
Утро добрым не бывает!

bdfy
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.01.2004 (Вс) 19:16

Сообщение bdfy » 30.01.2004 (Пт) 22:17

Звуковая карта у меня встроеннай realtec ALC650, колонки от музыкального центра Sony.
Просто железного решения проблемы я не нашел , остается только такое .
Такую же ветку я запостил на хоботе
http://forum.ixbt.com/0022/048467.html
, есть там кадры специализирующиеся именно на ВБ-скриптах
есть интересные идеи , с реализацией пока только плохо .
Особенно интересно можно ли скрипт ( если мы его все же напишем ) интегрировать в винду .

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.06.2004 (Сб) 12:32

Народ, не хочу показаться грубым..., но вы хоть подумайте чем вы занимаетесь ???!! Неужели так тяжело перед выключением компа нажать кнопку выключения динамиков ?? :shock:

P.S Скоро так обленимся, что заставим комп нас к сортиру по нужде возить ? :? ...

bdfy
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.01.2004 (Вс) 19:16

Сообщение bdfy » 12.06.2004 (Сб) 13:25

ALX_2002
К сожалению , gjghjc прав оказался
Вопрос, а колонки активные или пассивные.
Если активные то ИМХО бесполезно какой либо код писать, там только ручками громкость убирать придется. Так как треск это наводки на усилитель колонок. Если под встроеной звуковухой понимается звуковуха с усилителем тогда есть смысл поизвращаться.

Сейчас у меня C-media 8738 - треск чуть меньший , Но все равно присутсвует .
короче идея была глуповатая , так что никто этим уже давно не занимаеться ;)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот и гости: 17

    TopList  
cron