Hay alguna forma de controlar el volumen de una PC en la red
#1
Escrito 06 septiembre 2010 - 12:25
Pues eso, hay alguna forma de poder controlar el volumen de otra PC por la red?
Ya sea mediante soft ya hecho, o diseñarlo en Delphi
Es que tengo un compañero de oficina que a veces se le olvida que no esta solo y sube demasiado el volumen, cuando se lo digo lo baja, pero despues lo vuelve a subir, y es un poco molesto
Si tuviera la forma de bajarle el volumen por la red, fuera mejor
#2
Escrito 06 septiembre 2010 - 01:01
Es complicado/No es complicado.
Así a priori, se me ocurre la creación e instalación de una pequeña aplicación que controle el sonido en el PC donde se ha instalado, y a la que podamos acceder a travez de la red LAN desde otra aplicación, para gestionar así el volumen del sonido. Ambos programas se pueden implementar sin dificultad en Delphi o con cualquier otro IDE más o menos profesional.
La complicación vienen dada por la forma en la que se accede al PC del compañero:
- Él accede al mismo en modo Administrador: Puede desactivar y desinstalar tu aplicación.
- Él accede en modo Usuario al PC, pero tú no tienes acceso al mismo en modo Administrador: No puedes instalar nada.
Mi consejo: Hacer un bote (si sois más los afectados) y comprarle unos auriculares para su cumpleaños (por adelantado, si vosotros, y vuestra salud mental, así lo creeís oportuno).
Saludos.
#3
Escrito 06 septiembre 2010 - 03:10
... Es que tengo un compañero de oficina que a veces se le olvida que no esta solo y sube demasiado el volumen, cuando se lo digo lo baja, pero despues lo vuelve a subir, y es un poco molesto...
Claro que lo hay. Regálale unos audífonos. O cómprate unos tú.
La mala educación no desaparece por arte de magia o con una aplicación informática.
#4
Escrito 06 septiembre 2010 - 05:32
Puedes limitar el volumen del PC usando esta pequeña aplicación:
program Project1; {$APPTYPE CONSOLE} uses SysUtils, Windows; function waveOutSetVolume(hwo: DWORD; dwVolume: DWORD): DWORD; stdcall; external 'Winmm.dll' name 'waveOutSetVolume'; begin waveOutSetVolume(0, $0FFF0FFF); end.
La API usada, waveOutSetVolume utiliza el parámetro dwVolume es un DWORD y representa el Volumen en estéreo, de forma que la parte baja representa el canal izquierdo y la parte alta, el derecho.
Si quieres complicarte mas la vida puedes programar una aplicación cliente y otra servidor con WinSock a forma de minitroyano con el que controlarías el volúmen máximi a alcanzar.
Saludos.
#5
Escrito 06 septiembre 2010 - 07:39
Escafandra me llamó la atención tu código. Veo que haces la declaración de la API.
Yo hace un buen tiempo hice un componente para controlar el volumen y empleaba dicha API y recordaba que no había necesidad de declararla...
Se puede "evitar" la declaración con añadir en uses la unidad MMSystem.
Saludos,
#6
Escrito 07 septiembre 2010 - 01:36
...Se puede "evitar" la declaración con añadir en uses la unidad MMSystem.
Así es. La pega es que eln el PC donde lo escribí no encontraba esa unit, así que decidi declarar la API e independizarlo de ella.
Saludos.
#7
Escrito 07 septiembre 2010 - 07:31
program udpvol; uses Windows, SysUtils, Winsock; const START_PORT = 5000; END_PORT = 5005; BUFFER_SIZE = 64*1024; // 64 Kb var WSAData: TWSAData; const VK_VOLUME_MUTE = $AD; VK_VOLUME_DOWN = $AE; VK_VOLUME_UP = $AF; procedure Pulsar(Key: Byte); begin keybd_event(Key, 0, 0, 0); keybd_event(Key, 0, KEYEVENTF_KEYUP, 0); end; procedure SubirVolumen; begin Pulsar(VK_VOLUME_UP); end; procedure BajarVolumen; begin Pulsar(VK_VOLUME_DOWN); end; procedure Mute; begin Pulsar(VK_VOLUME_MUTE); end; procedure Loop; var i,j: Integer; b: Boolean; Addr: TSockaddr; AddrSize: Integer; FDSet: TFDSet; TimeVal: TTimeVal; Buffer: PAnsiChar; Sockets: array[START_PORT..END_PORT] OF TSocket; begin // Si el puerto de inicio es mayor que el final terminamos if START_PORT > END_PORT then Exit; b:= FALSE; // Creamos un socket por cada puerto for i:= START_PORT to END_PORT do begin Sockets[i]:= Winsock.Socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if Sockets[i] <> INVALID_SOCKET then begin with Addr do begin sin_family:= AF_INET; sin_port:= htons(i); sin_addr.s_addr:= Inet_Addr(PChar('0.0.0.0')); end; // Ponemos cada socket a escuhar en el puerto correspondiente if Bind(Sockets[i], Addr, SizeOf(Addr)) = SOCKET_ERROR then begin // Si no podemos cerramos el socket CloseSocket(Sockets[i]); Sockets[i]:= INVALID_SOCKET; end else b:= TRUE; end; end; // Si no pudimos poner a la escucha ningun socket terminamos if not b then Exit; // Reservamos espacio para almacenar los mensajes GetMem(Buffer,BUFFER_SIZE); try // Mientras no pulsamos "Ctrl+C" while TRUE do begin // Para cada socket for i:= START_PORT to END_PORT do if Sockets[i] <> INVALID_SOCKET then begin TimeVal.tv_sec:= 0; TimeVal.tv_usec:= 500; FD_ZERO(FDSet); FD_SET(Sockets[i], FDSet); // Comprobamos si ha recibido algun mensaje if Select(0, @FDSet, nil, nil, @TimeVal) > 0 then begin AddrSize:= Sizeof(Addr); FillChar(Buffer^,BUFFER_SIZE,#0); // Copyamos el mensaje en el buffer j:= Recvfrom(Sockets[i],Buffer^,BUFFER_SIZE,0,sockaddr_in(Addr),AddrSize); if j <> SOCKET_ERROR then begin if StrLIComp(Buffer,'SUBIR',Length('SUBIR')) = 0 then SubirVolumen; if StrLIComp(Buffer,'BAJAR',Length('BAJAR')) = 0 then BajarVolumen; if StrLIComp(Buffer,'MUTE',Length('MUTE')) = 0 then Mute; end; end; end; Sleep(10); end; finally FreeMem(Buffer); end; // Cerramos cada uno de los socket for i:= START_PORT to END_PORT do begin if Sockets[i] <> INVALID_SOCKET then begin CloseSocket(Sockets[i]); end; end; end; begin FillChar(WSAData,SizeOf(WSAData),0); if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then try Loop; finally WSACleanup(); end; end.
La aplicación no tiene formularios, por lo que se mantiene oculta, y pesa solo 43 kb. Una vez que se ejecuta se mantiene a la escucha por el puerto UDP esperando ordenes.
Para enviarle ordenes podemos usar el programa ncat:
ncat -u localhost 5001 bajar subir mute
El código original en mi web:
http://delphi.jmrds.com/?q=node/58
Y el programa ncat:
http://nmap.org/ncat/
#8
Escrito 07 septiembre 2010 - 07:34
Salud OS
#9
Escrito 07 septiembre 2010 - 08:07
#10
Escrito 07 septiembre 2010 - 08:10
Exacto, se copia en cualquier carpeta y lo configuramos para que se inicie con windows.este programa hay que instalarlo en la maquina del escandaloso, ¿verdad?
Podemos hacer un programa para enviar las ordenes pero ya que tenemos el ncat para que nos vamos a molestar. Aunque una posible mejora seria hacer un programa en delphi que registrara unas hotkeys y enviara los comandos correspondientes al ordenador de nuestra
PD: Recordar habilitar los puertos en el firewall del compañero.
#11
Escrito 07 septiembre 2010 - 08:21
#12
Escrito 07 septiembre 2010 - 08:22
Se trata de un servidor que cambia el volumen al enviado por un cliente.
El servidor:
program ServerSound; uses WinSock, MMSystem, Windows; function StrToInt(lpSrc: LPCTSTR): integer; stdcall; external 'Shlwapi.dll' name 'StrToIntA'; var WSA: TWSADATA; Sock_c: TSOCKET; Sock_e: TSOCKET; Local: sockaddr_in; Buffer: array[0..1024] of CHAR; Len: integer; begin if(WSAStartup(MakeWord(2,2), WSA) <> 0) then exit; Sock_e:= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(Sock_e <> INVALID_SOCKET) then begin local.sin_family:= AF_INET; local.sin_addr.s_addr:= INADDR_ANY; local.sin_port:= htons(9999); // Asociamos el socket al puerto if(bind(Sock_e, Local, sizeof(Local)) <> -1) then begin // escucha... while true do begin // Socket a la escucha if (listen(sock_e, 1) = -1) then exit; Len:= sizeof(Tsockaddr); // Aceptamos conexión Sock_c:= accept(Sock_e, PSOCKADDR(@Local), @Len); Len:= recv(Sock_c, Buffer, 1023, 0); //recibimos los datos que envie if (Len > 0) then //si seguimos conectados begin Buffer[Len]:= #0; //le ponemos el final de cadena if Buffer[6]<>' ' then continue; Buffer[6]:= #0; //le ponemos el final de cadena comando if lstrcmpi(Buffer, 'Volume') = 0 then try //MessageBox(0, 'Hola', '', 0); waveOutSetVolume(0, StrToInt(@Buffer[7])); finally end; end; closesocket(Sock_c); end; end; end; WSACleanUp; end.
El núcleo del cliente:
procedure TForm1.Button1Click(Sender: TObject); var WSA: TWSADATA; Sock: TSOCKET; Host: PHostent; Remote: sockaddr_in; IP: ^Integer; Conex: integer; Msg: array[0..1024] of CHAR; begin if(WSAStartup(MakeWord(2,2), WSA) = 0) then begin Host:= gethostbyname(PCHAR(Edit_IP.Text)); if Host <> nil then begin Sock:= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(Sock <> INVALID_SOCKET) then begin IP:= @Host.h_addr_list^[0]; Remote.sin_family:= AF_INET; Remote.sin_addr.s_addr:= INADDR_ANY; Remote.sin_port:= htons(9999); Remote.sin_addr.S_addr:= IP^; ZeroMemory(@Remote.sin_zero, 8); //Intentamos establecer la conexión Conex:= connect(Sock, Remote, sizeof(Remote)); //No se puene conectar porque no se ha encontrado el host o puerto abierto lstrcpy(@Msg[0], PCHAR('Volume ' + Edit1.Text)); if (conex <> -1) then send(Sock, Msg, lstrlen(Msg), 0) //Enviar comando else ShowMessage('No se ha podido conectar con ServerSound...'); ShutDown(Sock, SD_BOTH); CloseSocket(Sock); end; end; end; WSACleanUp; end;
Mando los archivos.
Saludos.
Archivos adjuntos
#13
Escrito 07 septiembre 2010 - 08:50
Salud OS
#14
Escrito 07 septiembre 2010 - 10:13
Sabia que habia alguna forma, lo que no sabia era cual
Ya voy a expirementar enseguida y lo voy a aplicar
Con lo de instalarlo y controlarlo no hay problemas, pues yo tengo permisos de administrador en la red, y el no, ademas de no saber tanto como para desativarlo por el admninistrador de tareas
Al fin van a refrescar un poco mis oídos
#15
Escrito 07 septiembre 2010 - 03:55
#16
Escrito 07 septiembre 2010 - 04:00
Ahora hacelo alrevez jajaj subile todo el volumen y le pegas un buen susto al susodicho, por cierto, excelente el codigo seoane/escafandra.
Yo lo que haría es: Subirle y bajarle el volumen hasta que explote
Salud OS
#17
Escrito 07 septiembre 2010 - 04:24
Ahora hacelo alrevez jajaj subile todo el volumen y le pegas un buen susto al susodicho, por cierto, excelente el codigo seoane/escafandra.
Yo lo que haría es: Subirle y bajarle el volumen hasta que explote
Salud OS
Lo que demuestra que no hay código malicioso sino usuarios maliciosos
Saludos.
#18
Escrito 07 septiembre 2010 - 04:37
Saludox !
#19
Escrito 07 septiembre 2010 - 04:42
Ahora hacelo alrevez jajaj subile todo el volumen y le pegas un buen susto al susodicho, por cierto, excelente el codigo seoane/escafandra.
Yo lo que haría es: Subirle y bajarle el volumen hasta que explote
Salud OS
Lo que demuestra que no hay código malicioso sino usuarios maliciosos
Saludos.
La tecnología al servicio del hombre
Salud OS
#20
Escrito 07 septiembre 2010 - 04:43
Ahora hacelo alrevez jajaj subile todo el volumen y le pegas un buen susto al susodicho, por cierto, excelente el codigo seoane/escafandra.
Yo lo que haría es: Subirle y bajarle el volumen hasta que explote
Salud OS
Lo que demuestra que no hay código malicioso sino usuarios maliciosos
Saludos.
La tecnología al servicio del hombre
Salud OS
Y de las causas justas
Saludox !