Detecção de conexão à internet 2: a missão
12/12/2003
0
É o seguinte: estava querendo fazer um programinha que detectasse conexão à internet em segundo plano. Nosso colega Francisco sugeriu o seguinte:
function TipoConexao:boolean; var flags: dword; begin Result := InternetGetConnectedState(@flags, 0); if Result then begin showmessage(´Conexão a Internet está Ativa´); if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then showmessage(´Conexão por modem´); if (flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then showmessage(´Conexião por lan´); if (flags and INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY then showmessage(´Conexião por proxy´); if (flags and INTERNET_CONNECTION_MODEM_BUSY) =INTERNET_CONNECTION_MODEM_BUSY then showmessage(´modem ocupado´); end; end; procedure TForm1.Button1Click(Sender: TObject); begin TipoConexao; end;
Acontece que mesmo se eu estiver off-line, o programa acusa o computador como conectado. O mesmo acontece qdo eu tento utilizar componentes como o TIdIPWatch.
Alguém, por favor, pode me explicar por que?
Desde já grato, sucesso a todos
Tnaires
Posts
12/12/2003
Fabio.hc
1º) Você deve acrescentar um componente NMFTP (da paleta FastNet).
2º) Insira o seguinte código no evento OnShow do formulário.
If (NMFtp1.GetLocalAddress <> ´0,0,0,0´) Then ShowMessage(´Você não está conectado!´) Else ShowMessage(´Você está conectado!´);
3º) Execute o programa e veja o resultado.
12/12/2003
Tnaires
Muito obrigado pela atenção e pela ajuda!!! Mas eu já tentei 3 coisas:
- tentei usar esse componente q vc falou;
- tentei usar o método IsOnLine da classe TIdIPWatch (paleta Indy Miscellaneous);
- tentei usar a sugestão do Francisco
Mas eu simplesmente não entendo pq essas 3 tentativas indicaram meu computador como conectado, qdo na verdade eu estava desconectado.
E eu relanço a questão: Por quê?!
Sucesso a todos...
13/12/2003
Fabio.hc
unit Unit4; interface uses Windows, SysUtils, Registry, WinSock, WinInet; type TConnectionType = (ctNone, ctProxy, ctDialup); function ConnectedToInternet : TConnectionType; function RasConnectionCount : Integer; implementation const cERROR_BUFFER_TOO_SMALL = 603; cRAS_MaxEntryName = 256; cRAS_MaxDeviceName = 128; cRAS_MaxDeviceType = 16; type ERasError = class(Exception); HRASConn = DWord; PRASConn = ^TRASConn; TRASConn = record dwSize: DWORD; rasConn: HRASConn; szEntryName: Array[0..cRAS_MaxEntryName] Of Char; szDeviceType : Array[0..cRAS_MaxDeviceType] Of Char; szDeviceName : Array [0..cRAS_MaxDeviceName] of char; end; TRasEnumConnections = function (RASConn: PrasConn; { buffer para receber dados da conexao} var BufSize: DWord; { tamanho em bytes do buffer } var Connections: DWord { numero de conexoes escritas no buffer } ): LongInt; stdcall; function ConnectedToInternet: TConnectionType; var Reg : TRegistry; bUseProxy : Boolean; UseProxy : LongWord; begin Result := ctNone; Reg := TRegistry.Create; with REG do try try RootKey := HKEY_CURRENT_USER; if OpenKey(´\Software\Microsoft\Windows\CurrentVersion\Internet settings´,False) then begin //I just try to read it, and trap an exception if GetDataType(´ProxyEnable´) = rdBinary then ReadBinaryData(´ProxyEnable´, UseProxy, SizeOf(LongWord) ) else begin bUseProxy := ReadBool(´ProxyEnable´); if bUseProxy then UseProxy := 1 else UseProxy := 0; end; if (UseProxy <> 0) and ( ReadString(´ProxyServer´) <> ´´ ) then Result := ctProxy; end; except //Nao conectado com proxy end; finally Free; end; if Result = ctNone then begin if RasConnectionCount > 0 then Result := ctDialup; end; end; function RasConnectionCount : Integer; var RasDLL : HInst; Conns : Array[1..4] of TRasConn; RasEnums : TRasEnumConnections; BufSize : DWord; NumConns : DWord; RasResult : Longint; begin Result := 0; //Load the RAS DLL RasDLL := LoadLibrary(´rasapi32.dll´); if RasDLL = 0 then exit; try RasEnums := GetProcAddress(RasDLL,´RasEnumConnectionsA´); if @RasEnums = nil then raise ERasError.Create(´RasEnumConnectionsA not found in rasapi32.dll´); Conns[1].dwSize := Sizeof (Conns[1]); BufSize := SizeOf(Conns); RasResult := RasEnums(@Conns, BufSize, NumConns); If (RasResult = 0) or (Result = cERROR_BUFFER_TOO_SMALL) then Result := NumConns; finally FreeLibrary(RasDLL); end; end; end.
No Form:
procedure TForm1.Button1Click(Sender: TObject); begin If (RasConnectionCount = 0) Then ShowMessage(´Você não está conectado!´) Else ShowMessage(´Você está conectado!´); end;
14/12/2003
Tnaires
MUUUITO obrigado, funcionou muito bem!
Só tem uma anomalia... Qdo a ligação ainda está sendo efetuada (o computador não está de fato conectado, mas ainda discando) o programa afirma q ele está conectado. Mas não é problema, valeu mesmo pela solução!
Sucesso
09/01/2004
Fausto_chiappone
If (NMFtp1.GetLocalAddress <> ´0,0,0,0´) Then
ShowMessage(´Você não está conectado!´)
Else
ShowMessage(´Você está conectado!´);
Creio que o sinal de ´<>´ deveria ser trocado por ´=´
Naum to com o Delphi aqui aberto. Por isso naum tenho certeza.
Mas normalmente, quando o computador não está conectado, o IP dele é 0.0.0.0, e naum diferente!
Mas esse código soh deve funcionar uma vez, e ainda assim, quando o computador naum estiver na rede!
Depois de conectado (o IP soh muda depois de conectado, naum quando tah discando!), se cair a conexao, o codigo vai acusar o computador como conectado!
Eu acho!
09/01/2004
Tnaires
Eu havia notado esse problema qdo tentei usar a primeira sugestão do Fábio. Mas o problema é q o resultado dessa função aí, na minha máquina, retorna um IP diferente de 0.0.0.0, mesmo sem estar conectado à internet. No caso, é o IP q estava na conexão anterior. E é isso q eu não entendo, pois assim como vc, várias pessoas q eu perguntei afirmaram q o IP é nulo sem estar conectado.
Abraços
Clique aqui para fazer login e interagir na Comunidade :)