Página 1 de 1

Volumen del sistema...

Publicado: 03 Feb 2011, 02:43
por Marcelo
Hola, acá estoy intentando mis primeros programas y con el afan de ir investigando un poco estoy intentando migrar pequeños programitas que tengo hechos en otras cosas, en este caso Visual DialogScript, antes de empezar a hacerlos nuevos directamente desde autoit
En este caso era un programita que quedaba corriendo de fondo y era una especia de OSD para el control del volumen y mute del sistema.
Leyendo un poco por acá y en el archivo de ayuda pude encontrar solo la forma de controlar el volumen mediante SEND, aca viene la primer pregunta: Existe alguna manera de saber cual es el valor actual del volumen?, así puedo mediante calculos generar una barra de 0 a 100%
Y ya que estamos sigo con las preguntas básicas: se puede hacer un form sin la barra superior? y transparente?
Desde ya muchas gracias por la paciencia, ya llegará el momento en que pueda ayudar a alguien también (esperemos) ;)
Adjunto el primer intento de script...

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=C:\Fuentes\Autoit\Volumen\Volumen.kxf
$Form1 = GUICreate("Control de Volumen", 623, 118, 194, 321)
$Button1 = GUICtrlCreateButton("Menos", 40, 88, 75, 25)
$Button2 = GUICtrlCreateButton("Más", 128, 88, 75, 25)
$Button3 = GUICtrlCreateButton("Mute", 216, 88, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Send("{VOLUME_DOWN}")
		Case $Button2
			 Send("{VOLUME_UP}")
		Case $Button3
			 Send("{VOLUME_MUTE}")
	EndSwitch
WEnd


Re: Volumen del sistema...

Publicado: 03 Feb 2011, 12:28
por Ximorro
Puessss, si es con Vista la cosa está complicada, yo usé una vez esto (con completa satisfacción):
http://www.autoitscript.com/forum/topic ... er-volume/

Ha hecho una dll para poder acceder a ello. En el zip está todo el proyecto pero basta con tomar la dll y ponerla en la misma carpeta donde esté tu script (o bien desde el script pones el camino correspondiente a la DLL).

Por ejemplo para ver el volumen se puede hacer así:

Código: Seleccionar todo

#AutoIt3Wrapper_Plugin_Funcs=_GetMasterVolumeScalar_Vista

$hDLL = PluginOpen("vista_vol.dll")

$vol = _GetMasterVolumeScalar_Vista()
ConsoleWrite("Get Vol Error: " & @error & @CRLF)
ConsoleWrite("Volume: " & $vol & " (scalar)" & @CRLF)

PluginClose($hDLL)
En #AutoIt3Wrapper_Plugin_Funcs tienes que poner las funciones que vas a usar

Esta parafernalia es para poder ver/cambiar el volumen general en Vista/Seven, de lo contrario sólo cambiaría el particular de la aplicación que lo ejecuta (tu script).

No te pierdas los ejemplos que hay en la entrada del foro que te he puesto, que eso no está incluido en el zip pero es muy útil para ver cómo usar todas las funciones.

En XP puedes usar esto:
http://www.autoitscript.com/forum/topic ... audio-au3/
Hace mucho más de lo que necesitas, sólo tendrías que ejecutar _SoundGetMasterVolume


Sí se puede hacer un GUI como dices, pero te advierto que son peliagudos de usar.
Es cosa de estilos, sin barra puede ser así:
GUICreate("Gui1", 700, 400, 100, 100, $WS_POPUP, $BitOR($WS_EX_TOPMOST,$WS_EX_TOOLWINDOW))

Por defecto todas las ventanas se crean con $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP y $WS_SYSMENU, pero al poner a mano sólo $WS_POPUP desactivo las demás, principalmente $WS_CAPTION que pone la barra.

Como no hay controles tienes que poner maneras de cerrar esa ventana por código, mientras pruebas desde AutoIt puedes cerrarlo por el icono en la bandeja del sistema.

Lo de la transparencia, dependiendo de lo que quieras tiene varios niveles de dificultad. ¿Qué quieres decir? ¿una ventana semitransparente (fácil) o una ventana con "agujeros" en la que puedes ver a través (difícil)?.

Si crees que este hilo se va a alargar con la consulta del GUI mejor pon una entrada diferente, para que los foreros puedan encontrar fácilmente la consulta cuando busquen (no es fácil imaginar que se encuentra cómo quitar la barra de título de un GUI en una entrada que se llama "Volumen del sistema") ;-)

Re: Volumen del sistema...

Publicado: 04 Feb 2011, 00:03
por Marcelo
Muchísimas gracias Ximorro! Si, mejor dividamos los temas así puedo seguir molestando en ambos lados ;)
Con respecto a "audio.au3" es justo lo que necesitaba ya que uso XP!! Espectacular!!! peeeero, al script que adjunte en el primer post le agregué al comienzo:

Código: Seleccionar todo

#include <audio.au3>
y en cualquier parte del programa que quiera llamar a una función el script termina, sin errores pero termina..
Es como si la misma función pidiera finalizar... hay algo que esté olvidando agregar?...

a la función la llamo por ejemplo así

Código: Seleccionar todo

$vol = _SoundGetMasterVolume()
y esta es la ultima linea procesada de mi programa...

Muchísimas gracias por la paciencia!!

Marcelo

PD: Me olvidaba: Tu DLL que sirve para vista y 7, también sirve para XP o es solo para esos dos sistemas?

Re: Volumen del sistema...

Publicado: 04 Feb 2011, 10:08
por Ximorro
¿Pero qué error da?
¿No puedes poner un código de ejemplo?
Asegúrate de que está encontrando audio.au3, si pones
#include <audio.au3>
es porque está en la carpeta de las UDF que vienen con AutoIT

Si lo tienes en la misma carpeta que tu script ponlo con comillas:
#include "audio.au3"
con eso también puedes poner el path, por ejemplo
#include "c:\programacion\misUDF\audio.au3"

Mira, he hecho este espectacular programa:

Código: Seleccionar todo

#include "audio.au3"
ConsoleWrite("Volumen: " & _SoundGetMasterVolume() & @CR)
y me funciona perfectamente.

Uso la consola porque es muy cómodo desde Scite, espero que uses un editor como Scite para programar.
Si quieres sacarlo en ventanita puedes hacer:
MsgBox(4096, "Sonido", "Volumen: " & _SoundGetMasterVolume())

Sobre el otro, NO es mi dll, es de un tal wraithdu y yo no tengo ni idea de cómo se hace eso, pero sé usarla ;-)
Me parece que no va en XP, la ha hecho específicamente para Vista porque el sistema de sonido ha cambiado y por ejemplo SoundSetWaveVolume (porque sí, AutoIt tiene una función para poner el volumen, aunque no leerlo) sólo pone el volumen para el script (por ejemplo por si tocas un mp3 desde tu script) pero no toca el volumen global para que afecte a otras aplicaciones.
En XP me parece que da error porque no usa el mismo mecanismo, pero puedes probarlo a ver qué te hace.

Re: Volumen del sistema...

Publicado: 04 Feb 2011, 17:03
por Marcelo
No, no hay caso...
Tanto en la máquina de casa como en la del trabajo pasa lo mismo. NO da error ni nada pero es como que la función en luigar de ejecutarse cerrara el programa. O sea, si corro el mismo "espectacular programa" que propones, aprieto F5 y asi como empieza termina sin dar ningún informe ni error en consola. Y si lo hago con msgbox pasa lo mismo F5 y así como empieza termina y ninguna ventanita aparece...
Hay algún log o informe que pueda pegar acá para ayudar a descubrir el problema?
Te adjunto una copia de la consola de Scite para ver si puede decirte algo...

Para el siguiente programa:

Código: Seleccionar todo

#include "audio.au3"
ConsoleWrite("Volumen: " & _SoundGetMasterVolume() & @CR)
La consola informa:
  • >"C:\Archivos de programa\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "c:\Fuentes\Autoit\Volumen\prueba.au3" /autoit3dir "C:\Archivos de programa\AutoIt3" /UserParams
    +>12:00:28 Starting AutoIt3Wrapper v.2.0.1.24 Environment(Language:0C0A Keyboard:0000080A OS:WIN_XP/Service Pack 3 CPU:X86 OS:X86)
    >Running AU3Check (1.54.19.0) from:C:\Archivos de programa\AutoIt3
    +>12:00:28 AU3Check ended.rc:0
    >Running:(3.3.6.1):C:\Archivos de programa\AutoIt3\autoit3.exe "c:\Fuentes\Autoit\Volumen\prueba.au3"
    +>12:00:30 AutoIT3.exe ended.rc:0
    >Exit code: 0 Time: 6.022
Gracias por la ayuda!!

Marcelo

Re: Volumen del sistema...

Publicado: 04 Feb 2011, 21:40
por Chefito
Mmmmmm.....mejor ni preguntes lo que te voy a poner :smt005 :smt005 :smt005 . Pruebalo y punto :smt003 .

Abre el archivo audio.au3. Comenta la línea de la función que te dejo abajo:

Código: Seleccionar todo

Func _GetMixerVolume($MixerDevice)
	;default mixer is always 0 (so far) which is last audio device installed or prefered deviced selected by user
	$curmixer = 0
	Const $MM_MIXM_CONTROL_CHANGE = 0x3D1
	Const $CALLBACK_WINDOW = 0x10000
 	OpenAllMixers($mixers)
;~ 	If @error Then Exit      ;comenta esta línea
	$hmxobj = MixerOpen($curmixer, 0, $MM_MIXM_CONTROL_CHANGE, BitOR($CALLBACK_WINDOW, $MIXER_OBJECTF_MIXER))
	GetMXWaveoutID($mixers, $curmixer, $MixerDevice)
	$savevolume = GetSetOutVolume($mixers, $curmixer, 0, 0)
	$savevolume = BitAND($savevolume / 0xFFFF * 100, 0xffff)

	MixerClose($hmxobj)
 	CloseAllMixers($mixers)
	Return $savevolume
EndFunc   ;==>_GetMixerVolume
Guarda cambios.

Mira a ver si así te va.

Saludos.

Re: Volumen del sistema...

Publicado: 05 Feb 2011, 01:47
por Marcelo
No te lo pudo creer!!! Es eso!! :smt038
Comenté esa línea y santo remedio!! jajajaja y justo lo había probado con "SoundGetSetQuery.au3" que está en el mismo post que "audio.au3" y había funcionado. Solo que también tenia que agregarle un "#include" que faltaba. Y ME DI CUENTA!! ajajaja
Ahora verifico que otras líneas debería comentar para que siempre funcione :smt002 :smt003 :smt003
Muchas gracias Chefito!!!
Ahora termino el script y lo subo para que me digan si esta bien o a recuperatorio derecho :smt002

Re: Volumen del sistema...

Publicado: 06 Feb 2011, 03:02
por BasicOs
Por aquí tienes un tópico que señala como usar el control de sonido para XP y también para el Win7
http://www.autoitscript.com/forum/topic ... mecontrol/
#include 'Audio.au3' ;this is in the same DIR as the script... if you do not have Audio then Download it from the forums... it is Volly's UDF .
#NoTrayIcon
HotKeySet ('^{PGUP}', '_VOLUP')
HotKeySet ('^{PGDN}', '_VOLDOWN')
HotKeySet ('^{HOME}', '_VOLMUTE')
HotKeySet ('^{END}', '_EXIT')
$value = _SoundGetMasterVolume () ;Thank you Volly
$PopUP = 0
While 1
Sleep (100)
WEnd
Func _POPUP ()
Local $dW = @DesktopWidth, $dH = @DesktopHeight
Local $x = ($dW / 2), $y = ($dH / 15), $yp = ($dH * (7/8))
$PopUP = GUICreate ('', $x,$y, -1, $yp,BitOR(0x08000000,0x80000000, 0x10000000),0x00000100,WinGetHandle ('Program Manager',''))
GUICtrlCreateLabel ('',0,0,($x * ($value / 100)),($y / 2))
GUICtrlSetBkColor (-1,0x0000DF)
GUICtrlSetState (-1, 128)
GUICtrlCreateLabel ('',0,($y / 2),($x * ($value / 100)),($y / 2))
GUICtrlSetBkColor (-1, 0x0000B7)
GUICtrlSetState (-1, 128)
GUISetBkColor (0x0,$PopUP)
WinSetOnTop ($PopUP,'',1)
GUISetState ()
WinSetTrans ($PopUP,'',220)
EndFunc
Func _SetData ()
ControlMove ($PopUP,'','Static1',0,0,((@DesktopWidth / 2) * ($value / 100)),((@DesktopHeight /15) / 2))
ControlMove ($PopUP,'','Static2',0,((@DesktopHeight / 15) / 2),((@DesktopWidth / 2) * ($value / 100)),((@DesktopHeight /15) / 2))
EndFunc
Func _VOLDOWN ()
If $value = 0 Then Return
If Not WinExists ($PopUP,'') Then
_POPUP ()
Else
_SetData ()
EndIf
$value = $value - 1
_SoundSetMasterVolume ($value) ;Thank you Volly
Sleep (3000)
GUIDelete ($PopUP)
EndFunc
Func _VOLMUTE ()
Send ('{VOLUME_MUTE}')
EndFunc
Func _VOLUP ()
If $value = 100 Then Return
If Not WinExists ($PopUP,'') Then
_POPUP ()
Else
_SetData ()
EndIf
$value = $value + 1
_SoundSetMasterVolume ($value) ;Thank you Volly
Sleep (3000)
GUIDelete ($PopUP)
EndFunc
Func _EXIT ()
Exit
EndFunc
Salu22:)

Re: Volumen del sistema...

Publicado: 07 Feb 2011, 10:18
por Ximorro
¿¿Entonces el error está en la UDF??

Vaya Chefito, sí que has llegado hasta el fondo de la cuestión.

Marcelo, no creo que sea cosa de empezar a quitar comprobaciones de error, podría ser peor. Puestos a hacerlo bien lo que habría que hacer es mostrar un error al usuario. Flipo con la técnica de hacer un EXIT silencioso, muy mal.
Supongo que la cosa sería informar al creador de la udf para que lo solucione y modifique el post original, en vez de hacer un fork alternativo aquí.

Re: Volumen del sistema...

Publicado: 07 Feb 2011, 16:31
por Chefito
Ximorro escribió:Vaya Chefito, sí que has llegado hasta el fondo de la cuestión.
Sí, estaba aburrido y decidí seguir la función a ver que hacía. Logicamente, si no daba ningún tipo de error, lo más probable es que el código hiciese que se saliese por algún sitio :smt002 .
Ximorro escribió:Marcelo, no creo que sea cosa de empezar a quitar comprobaciones de error, podría ser peor. Puestos a hacerlo bien lo que habría que hacer es mostrar un error al usuario. Flipo con la técnica de hacer un EXIT silencioso, muy mal.
Pues sí. Hay que tener cuidado con lo que se toca cuando no sabes que hace y que puede ocurrir. Parece que ese error no es muy importante en el código, aunque puede que haya alguna situción en la cual si le pueda afectar. Sería analizar la función OpenAllMixers($mixers) y su comportamiento dentro del código a ver que pasa.
También te digo que ya que te da error esa función seguramente quitando estas tres líneas la función te seguirá funcionando:

Código: Seleccionar todo

   OpenAllMixers($mixers)
  If @error Then Exit      ;comenta esta línea
CloseAllMixers($mixers)
Pero quien sabe, como he dicho antes puede que en alguna situación afecte que le quites estas funciones. No se :smt017 .

Y por otra parte, como dice Ximorro, no se debería salir de ese modo de una función. Si sales por alguna causa (un posible error grave más adelante o en ese momento), antes debería haber puesto algo en la consola indicando el motivo.

Saludos.

Re: Volumen del sistema...

Publicado: 07 Feb 2011, 18:12
por Marcelo
Muchas gracias gente!!!
Una ayuda incalculable!
La verdad que el ejemplo que postea "BasicOS" es casi exactamente lo que buscaba hacer, solo que lo hice con una imagen de fondo para que quede acorde al programa principal (que aun no me animo a migrar a autoit... pero en un futuro cercano... :smt002 ) y la barra la hice con un "bmp" que redimensiono según el volumen de sistema.
Para que este script de "BasicOS" funcione tuve que también comentar el otro "if @error then exit" que tiene Audio.au3 y así funcionó de primera.
Ya que estamos en esto.... Alguien tiene idea de cual es la diferencia de subir y bajar el volumen con esta función o mediante Send()?
En mi script lo estoy haciendo mediante esta segunda....

Saludos

Marcelo

Re: Volumen del sistema...

Publicado: 08 Feb 2011, 20:28
por BasicOs
Lo que suele hacer Autoit con estas funciones es trabajar directamente con la dll, posiblemente haga lo mismo pero llamando a esa función del sistema con la dll que le corresponde, sencillo y funcional :smt024 ,
Salu22:)