Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Hay alguna forma de controlar el volumen de una PC en la red (https://www.clubdelphi.com/foros/showthread.php?t=69756)

JoAnCa 06-09-2010 20:30:04

Hay alguna forma de controlar el volumen de una PC en la red
 
Hola a todos
Pues eso, hay alguna forma de poder controlar el volumen de otra PC por la red?
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 :rolleyes: :p

ContraVeneno 06-09-2010 20:37:38

si, te conectas al messenger, lo agregas a tu lista y luego intentas mandarle el mensaje:

"mira jijo de la mañana, si no le bajas al volumen, te voy a dar unos buenos en la cabezota para que no se te olvide..."

y listo, ya lo controlas por la red.

Saludos.

microbiano 06-09-2010 20:44:03

jajajaj
 
esta bueno tu chiste contra-veneno, aunque a mi gusto iria a su lugar le quito las bocinas y se las aviento por la ventana asi elimino el estres que me provoco el mismo jajaja y si de plano la bocina es interna le descoencto toa la pc no sin antes decirme el comentario de contra-veneno jajajaj

luisgutierrezb 06-09-2010 22:18:50

mejor cuando se vaya subele mas, para que cuando pase un jefe o algo se de cuenta, aparte de que mas se le van a echar encima

AzidRain 07-09-2010 01:46:27

Ya en serio Joanca, no hay forma de hacerlo (al menos no fácilmente) así como lo planteas. De todas formas si puedieras hacerlo sería un eterno estira y afloja, tu le subes...yo le bajo...tu le subes...yo le bajo. Solo con acceso al equipo físicamente puedes desactivar el audio via BIOS y así sí.

Neftali [Germán.Estévez] 07-09-2010 12:27:34

O le colocas un troyano (NOTA1) para poder hacerlo o le cortas el cable del altavoz. ;)

NOTA1: En este caso el troyano en un simple programita hecho en Delphi, con un Server Socket que admita peticiones desde el tuyo para controlar el volumen.

Un saludo.

JoAnCa 08-09-2010 16:16:10

Cita:

Empezado por Neftali (Mensaje 375706)
O le colocas un troyano (NOTA1) para poder hacerlo o le cortas el cable del altavoz. ;)

NOTA1: En este caso el troyano en un simple programita hecho en Delphi, con un Server Socket que admita peticiones desde el tuyo para controlar el volumen.

Un saludo.

Pues de hecho, si existe la forma, no solo de bajarle el volumen, tambien para enmudecerlo

Aporte de Seoane:
Código Delphi [-]
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.

Aporte de escafandra

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

El servidor:
Código Delphi [-]
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:

Código Delphi [-]
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;
Como ven en informática Todo se puede, el límite es la imaginación
:D;)

Claro que hay que saber encontrar como hacerlo.


Edito: A petición de JoAnCa, aquí está el enlace de donde ha extraído la información, se trata de la web de nuestros amigos de delphiaccess, un saludo para ellos.

Neftali [Germán.Estévez] 08-09-2010 16:42:48

Cita:

Empezado por JoAnCa (Mensaje 375787)
Pues de hecho, si existe la forma, no solo de bajarle el volumen, tambien para enmudecerlo

En ningun momento he dudado de ello, y si buscas por internet encontrarás códigos similares a los que has colocado (link, link, link o estos dos en torry, 1 y 2); Personalmente te había entendido mal (o no del todo) y pensé que te referías a hacerlo desde tu ordenador -sin acceder al suyo-. De ahí que no te adjunté ningun link.

La única forma que se me ocurrió de hacerlo sin acceder, es utilizando WMI, para lo que no tendrías que acceder físicamente, pero sí conocer usuario y password. Pensé que utilizando WMI y la clase Win32_SoundDevice podrías conseguirlo. Desgraciadamente con esta clase sólo podrás consultar los valores actuales, pero no modificarlos, puesto que no posee ningun método que permita el cambio.

Gracias por los códigos.

JoAnCa 08-09-2010 19:50:25

Cita:

Empezado por Neftali (Mensaje 375793)
En ningun momento he dudado de ello, y si buscas por internet encontrarás códigos similares a los que has colocado (link, link, link o estos dos en torry, 1 y 2); Personalmente te había entendido mal (o no del todo) y pensé que te referías a hacerlo desde tu ordenador -sin acceder al suyo-. De ahí que no te adjunté ningun link.

La única forma que se me ocurrió de hacerlo sin acceder, es utilizando WMI, para lo que no tendrías que acceder físicamente, pero sí conocer usuario y password. Pensé que utilizando WMI y la clase Win32_SoundDevice podrías conseguirlo. Desgraciadamente con esta clase sólo podrás consultar los valores actuales, pero no modificarlos, puesto que no posee ningun método que permita el cambio.

Gracias por los códigos.

Neftalí yo sé que tu sabes para eso y para más, puse la cita de tu comentario para encabezar la forma en que se puede hacer, como bien dijiste:

Cita:

NOTA1: En este caso el troyano en un simple programita hecho en Delphi, con un Server Socket que admita peticiones desde el tuyo para controlar el volumen.
el post fue para aclararle a los anteriores que si se puede hacer

JoAnCa 08-09-2010 20:30:01

Para que puedan seguir mejoras en los codigos mostrados anteriormente lo pueden ver en

http://www.delphiaccess.com/forum/in...p?topic=3818.0


La franja horaria es GMT +2. Ahora son las 07:31:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi