Ir al contenido



Foto

Hay alguna forma de controlar el volumen de una PC en la red


  • Por favor identifícate para responder
101 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 710 mensajes
  • LocationPinar del Río, Cuba

Escrito 06 septiembre 2010 - 12:25

Hola a todos
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
  • 0

#2 Jagluiperd

Jagluiperd

    Member

  • Miembros
  • PipPip
  • 36 mensajes
  • LocationBuscando a Wally

Escrito 06 septiembre 2010 - 01:01

Hola.

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.
  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

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.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.689 mensajes
  • LocationMadrid - España

Escrito 06 septiembre 2010 - 05:32

Realmente va a ser difícil luchar contra ese individuo irrespetuoso.  :(

Puedes limitar el volumen del PC usando esta pequeña aplicación:



delphi
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils,
  7.   Windows;
  8.  
  9. function waveOutSetVolume(hwo: DWORD; dwVolume: DWORD): DWORD; stdcall;
  10.         external 'Winmm.dll' name 'waveOutSetVolume';
  11.  
  12. begin
  13.   waveOutSetVolume(0, $0FFF0FFF);
  14. 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.
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.929 mensajes
  • LocationArgentina

Escrito 06 septiembre 2010 - 07:39

Hola,

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,
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.689 mensajes
  • LocationMadrid - España

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.
  • 0

#7 seoane

seoane

    Advanced Member

  • Administrador
  • 1.218 mensajes
  • LocationEspaña

Escrito 07 septiembre 2010 - 07:31

Pues haciendo un poco de copy&paste he hecho esto:



delphi
  1. program udpvol;
  2.  
  3. uses
  4.   Windows,
  5.   SysUtils,
  6.   Winsock;
  7.  
  8. const
  9.   START_PORT = 5000;
  10.   END_PORT = 5005;
  11.   BUFFER_SIZE = 64*1024;  // 64 Kb
  12.  
  13. var
  14.   WSAData: TWSAData;
  15.  
  16. const
  17.   VK_VOLUME_MUTE = $AD;
  18.   VK_VOLUME_DOWN = $AE;
  19.   VK_VOLUME_UP = $AF;
  20.  
  21. procedure Pulsar(Key: Byte);
  22. begin
  23. keybd_event(Key, 0, 0, 0);
  24. keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
  25. end;
  26.  
  27. procedure SubirVolumen;
  28. begin
  29.   Pulsar(VK_VOLUME_UP);
  30. end;
  31.  
  32. procedure BajarVolumen;
  33. begin
  34.   Pulsar(VK_VOLUME_DOWN);
  35. end;
  36.  
  37. procedure Mute;
  38. begin
  39.   Pulsar(VK_VOLUME_MUTE);
  40. end;
  41.  
  42. procedure Loop;
  43. var
  44.   i,j: Integer;
  45.   b: Boolean;
  46.   Addr: TSockaddr;
  47.   AddrSize: Integer;
  48.   FDSet: TFDSet;
  49.   TimeVal: TTimeVal;
  50.   Buffer: PAnsiChar;
  51.   Sockets: array[START_PORT..END_PORT] OF TSocket;
  52. begin
  53.   // Si el puerto de inicio es mayor que el final terminamos
  54.   if START_PORT > END_PORT then
  55.     Exit;
  56.   b:= FALSE;
  57.   // Creamos un socket por cada puerto
  58.   for i:= START_PORT to END_PORT do
  59.   begin
  60.     Sockets[i]:= Winsock.Socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  61.     if Sockets[i] <> INVALID_SOCKET then
  62.     begin
  63.       with Addr do
  64.       begin
  65.         sin_family:= AF_INET;
  66.         sin_port:= htons(i);
  67.         sin_addr.s_addr:= Inet_Addr(PChar(&#39;0.0.0.0&#39;));
  68.       end;
  69.       // Ponemos cada socket a escuhar en el puerto correspondiente
  70.       if Bind(Sockets[i], Addr, SizeOf(Addr)) = SOCKET_ERROR then
  71.       begin
  72.         // Si no podemos cerramos el socket
  73.         CloseSocket(Sockets[i]);
  74.         Sockets[i]:= INVALID_SOCKET;
  75.       end else
  76.         b:= TRUE;
  77.     end;
  78.   end;
  79.   // Si no pudimos poner a la escucha ningun socket terminamos
  80.   if not b then
  81.     Exit;
  82.   // Reservamos espacio para almacenar los mensajes
  83.   GetMem(Buffer,BUFFER_SIZE);
  84.   try
  85.     // Mientras no pulsamos "Ctrl+C"
  86.     while TRUE do
  87.     begin
  88.       // Para cada socket
  89.       for i:= START_PORT to END_PORT do
  90.         if Sockets[i] <> INVALID_SOCKET then
  91.         begin
  92.           TimeVal.tv_sec:= 0;
  93.           TimeVal.tv_usec:= 500;
  94.           FD_ZERO(FDSet);
  95.           FD_SET(Sockets[i], FDSet);
  96.           // Comprobamos si ha recibido algun mensaje
  97.           if Select(0, @FDSet, nil, nil, @TimeVal) > 0 then
  98.           begin
  99.             AddrSize:= Sizeof(Addr);
  100.             FillChar(Buffer^,BUFFER_SIZE,#0);
  101.             // Copyamos el mensaje en el buffer
  102.             j:= Recvfrom(Sockets[i],Buffer^,BUFFER_SIZE,0,sockaddr_in(Addr),AddrSize);
  103.             if j <> SOCKET_ERROR then
  104.             begin
  105.               if StrLIComp(Buffer,&#39;SUBIR&#39;,Length(&#39;SUBIR&#39;)) = 0 then
  106.                 SubirVolumen;
  107.               if StrLIComp(Buffer,&#39;BAJAR&#39;,Length(&#39;BAJAR&#39;)) = 0 then
  108.                 BajarVolumen;
  109.               if StrLIComp(Buffer,&#39;MUTE&#39;,Length(&#39;MUTE&#39;)) = 0 then
  110.                 Mute;
  111.             end;
  112.           end;
  113.         end;
  114.       Sleep(10);
  115.     end;
  116.   finally
  117.     FreeMem(Buffer);
  118.   end;
  119.   // Cerramos cada uno de los socket
  120.   for i:= START_PORT to END_PORT do
  121.   begin
  122.     if Sockets[i] <> INVALID_SOCKET then
  123.     begin
  124.     CloseSocket(Sockets[i]);
  125.     end;
  126.   end;
  127. end;
  128.  
  129.  
  130.  
  131. begin
  132.   FillChar(WSAData,SizeOf(WSAData),0);
  133.   if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
  134.   try
  135.     Loop;
  136.   finally
  137.     WSACleanup();
  138.   end;
  139. 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:


delphi
  1. ncat -u localhost 5001
  2. bajar
  3. subir
  4. mute



El código original en mi web:
http://delphi.jmrds.com/?q=node/58

Y el programa ncat:
http://nmap.org/ncat/
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.551 mensajes
  • LocationMéxico

Escrito 07 septiembre 2010 - 07:34

Muy bueno (y), este programa hay que instalarlo en la maquina del escandaloso, ¿verdad?

Salud OS
  • 0

#9 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 680 mensajes
  • LocationMéxico D.F.

Escrito 07 septiembre 2010 - 08:07

Excelente, se lo voy a plantar a Mani, jajajajaja, saludos...
  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.218 mensajes
  • LocationEspaña

Escrito 07 septiembre 2010 - 08:10

este programa hay que instalarlo en la maquina del escandaloso, ¿verdad?

Exacto, se copia en cualquier carpeta y lo configuramos para que se inicie con windows.

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 victima compañero de trabajo, asi desde nuestro teclado controlaríamos su volumen  :D

PD: Recordar habilitar los puertos en el firewall del compañero.

  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.183 mensajes
  • LocationRepública Dominicana

Escrito 07 septiembre 2010 - 08:21

Hostia :o, jeje, ya sé a quién se lo aplicaré :D :D, gracias amigo seoane (y)
  • 0

#12 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.689 mensajes
  • LocationMadrid - España

Escrito 07 septiembre 2010 - 08:22

Bueno, yo estaba preparando un pequeño sistema... Algo menos sofisticado que el de seoane.

Se trata de un servidor que cambia el volumen al enviado por un cliente.

El servidor:

delphi
  1. program ServerSound;
  2.  
  3. uses
  4.   WinSock,
  5.   MMSystem,
  6.   Windows;
  7.  
  8. function StrToInt(lpSrc: LPCTSTR): integer; stdcall; external 'Shlwapi.dll' name 'StrToIntA';
  9.  
  10.  
  11. var
  12.   WSA:    TWSADATA;
  13.   Sock_c: TSOCKET;
  14.   Sock_e: TSOCKET;
  15.   Local:  sockaddr_in;
  16.   Buffer: array[0..1024] of CHAR;
  17.   Len:    integer;
  18. begin
  19.   if(WSAStartup(MakeWord(2,2), WSA) <> 0) then exit;
  20.   Sock_e:= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  21.   if(Sock_e <> INVALID_SOCKET) then
  22.   begin
  23.  
  24.     local.sin_family:= AF_INET;
  25.     local.sin_addr.s_addr:= INADDR_ANY;
  26.     local.sin_port:= htons(9999);
  27.  
  28.     // Asociamos el socket al puerto
  29.     if(bind(Sock_e, Local, sizeof(Local)) <> -1) then
  30.     begin
  31.       // escucha...
  32.       while true do
  33.       begin
  34.         // Socket a la escucha
  35.         if (listen(sock_e, 1) = -1) then exit;
  36.         Len:= sizeof(Tsockaddr);
  37.  
  38.         // Aceptamos conexión
  39.         Sock_c:= accept(Sock_e, PSOCKADDR(@Local), @Len);
  40.  
  41.         Len:= recv(Sock_c, Buffer, 1023, 0); //recibimos los datos que envie
  42.         if (Len > 0) then //si seguimos conectados
  43.         begin
  44.           Buffer[Len]:= #0; //le ponemos el final de cadena
  45.           if Buffer[6]<>' ' then continue;
  46.           Buffer[6]:= #0; //le ponemos el final de cadena comando
  47.           if lstrcmpi(Buffer, 'Volume') = 0 then
  48.             try
  49.               //MessageBox(0, 'Hola', '', 0);
  50.               waveOutSetVolume(0, StrToInt(@Buffer[7]));
  51.             finally
  52.             end;
  53.         end;
  54.         closesocket(Sock_c);
  55.       end;
  56.     end;
  57.   end;
  58.   WSACleanUp;
  59. end.

El núcleo del cliente:

delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   WSA:    TWSADATA;
  4.   Sock:  TSOCKET;
  5.   Host:  PHostent;
  6.   Remote: sockaddr_in;
  7.   IP:    ^Integer;
  8.   Conex:  integer;
  9.   Msg:    array[0..1024] of CHAR;
  10. begin
  11.   if(WSAStartup(MakeWord(2,2), WSA) = 0) then
  12.   begin
  13.     Host:= gethostbyname(PCHAR(Edit_IP.Text));
  14.     if Host <> nil then
  15.     begin
  16.       Sock:= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  17.       if(Sock <> INVALID_SOCKET) then
  18.       begin
  19.         IP:= @Host.h_addr_list^[0];
  20.         Remote.sin_family:= AF_INET;
  21.         Remote.sin_addr.s_addr:= INADDR_ANY;
  22.         Remote.sin_port:= htons(9999);
  23.         Remote.sin_addr.S_addr:= IP^;
  24.         ZeroMemory(@Remote.sin_zero, 8);
  25.  
  26.         //Intentamos establecer la conexión
  27.         Conex:= connect(Sock, Remote, sizeof(Remote));
  28.         //No se puene conectar porque no se ha encontrado el host o puerto abierto
  29.         lstrcpy(@Msg[0], PCHAR('Volume ' + Edit1.Text));
  30.         if (conex <> -1) then
  31.           send(Sock, Msg, lstrlen(Msg), 0) //Enviar comando
  32.         else
  33.           ShowMessage('No se ha podido conectar con ServerSound...');
  34.  
  35.         ShutDown(Sock, SD_BOTH);
  36.         CloseSocket(Sock);
  37.       end;
  38.     end;
  39.   end;
  40.   WSACleanUp;
  41. end;


Mando los archivos.


Saludos.

Archivos adjuntos


  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.551 mensajes
  • LocationMéxico

Escrito 07 septiembre 2010 - 08:50

Caramba !!!! y pensar que muchos pensabamos que no habia forma de hacer algo al respecto, me congratulo de tener amigos que se las saben de todas todas, son bárbaros ustedes dos (y)

Salud OS
  • 0

#14 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 710 mensajes
  • LocationPinar del Río, Cuba

Escrito 07 septiembre 2010 - 10:13

Muchas gracias a todos por sus respuestas  (y)
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  :p

Al fin van a refrescar un poco mis oídos  :s  :cheesy:
  • 0

#15 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 07 septiembre 2010 - 03:55

Ahora hacelo alrevez jajaj subile todo el volumen y le pegas un buen susto al susodicho, por cierto, excelente el codigo seoane/escafandra.
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.551 mensajes
  • LocationMéxico

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 :D :D :D

Salud OS
  • 0

#17 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.689 mensajes
  • LocationMadrid - España

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 :D :D :D

Salud OS


Lo que demuestra que no hay código malicioso sino usuarios maliciosos  :p  :D :D :D

Saludos.
  • 0

#18 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.484 mensajes
  • LocationMexico City

Escrito 07 septiembre 2010 - 04:37

Jajajajajajaja, porfas amigo JoAnCa tómale una foto a tu compañero en el momento en que la compu se vuelva loca subiendo y bajando el volumen y la cara de susto que ponga será invaluable... casi casi lo imagino.... jajajajajajajajajaja

:D :D :D :D :D

Saludox ! :)
  • 0

#19 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.551 mensajes
  • LocationMéxico

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 :D :D :D

Salud OS


Lo que demuestra que no hay código malicioso sino usuarios maliciosos  :p  :D :D :D

Saludos.


La tecnología al servicio del hombre :D :D :D

Salud OS
  • 0

#20 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.484 mensajes
  • LocationMexico City

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 :D :D :D

Salud OS


Lo que demuestra que no hay código malicioso sino usuarios maliciosos  :p  :D :D :D

Saludos.


La tecnología al servicio del hombre :D :D :D

Salud OS


Y de las causas justas (y) :D :D

Saludox ! :)
  • 0