Detecção de conexão à internet 2: a missão
Galerinha
É o seguinte: estava querendo fazer um programinha que detectasse conexão à internet em segundo plano. Nosso colega Francisco sugeriu o seguinte:
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
É 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
Curtidas 0
Respostas
Fabio.hc
12/12/2003
[b:9e757d108e]Como descobrir se você esta conectado com a Internet?[/b:9e757d108e]
1º) Você deve acrescentar um componente NMFTP (da paleta FastNet).
2º) Insira o seguinte código no evento OnShow do formulário.
3º) Execute o programa e veja o resultado.
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.
GOSTEI 0
Tnaires
12/12/2003
Olá Fábio
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...
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...
GOSTEI 0
Fabio.hc
12/12/2003
Tente esta:
No Form:
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;
GOSTEI 0
Tnaires
12/12/2003
Olá Fábio
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
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
GOSTEI 0
Fausto_chiappone
12/12/2003
No código que o fábio passou:
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!
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!
GOSTEI 0
Tnaires
12/12/2003
Olá Fausto
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
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
GOSTEI 0