Newsgroup: it.comp.lang.delphi
Titolo: IF (connessoainternet) THEN...

Salve,
come avrete capito dal soggetto mi serve una funzione boolean da chaimare
"connessoainternet" per esempio che restituisca TRUE se il computer è
connesso a internet e FALSE se invece non lo è.
QUalcuno ha già realizzato qualcosa del genere?
GRazie.
--
Giulio Pipitone (
www.Fighters4web.com
)
Libera associazione contro abusi in rete
Mirror italiano 
http://spam.abuse.net

 QUalcuno ha già realizzato qualcosa del genere?
InternetGetConnectedState()
--
- Carlo -

E' un buon consiglio, ci avevo già pensato e in effetti è uns istema
discreto...ma se funziona con connessioni dialup, non funziona con la mia
connessione LAN (ho fastweb in fibra ottica).
Non esiste un qualcosa più "universale" per tutti i tipi di connesione?
Faccio rpesente che serve a me ma che una volta fatto dovranno essere ing
rado di usarlo centinaia di persone con le connessioni internet più
disparate.
Grazie.
--


Sulle FAQ c'è una piccola tips al riguardo, che oltre a suggerire quello che
ti ha già detto Carlo, indica il nome di un componente che fa la stessa
cosa, ma magari puoi provarlo e vedere se si adatta anche al tuo caso.
Ti riporto il link diretto :
http://delphifaq.altervista.org/faq.php?is_connected
Altrimenti un'altra soluzione (rozza) sarebbe quella di fare un ping ad un
indirizzo ip remoto e vedere se va in timeout o meno.... l'unica cosa è che
se sei dietro ad un proxy.... ma questo lo potresti dedurre leggendo le
chiavi di registro per rilevare il default internet browser e le sue
impostazioni.
CIAOUX

indirizzo ip remoto e vedere se va in timeout o meno....
Il problema è che, su molti sistemi, quando non si è connessi, fare un
ping equivale a sollevare la finestrella di connessione di accesso
remoto.
-- 
Andrea Laforgia
#exclude <windows.h>

Puoi usare il componente TCP, se l'indirizzo è "0.0.0.0" allora non sei
connesso
Vedi se ti va bene:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if TCP1.LocalIp = '0.0.0.0' then
    ShowMessage(Non sei connesso!');
end;
--
Massimiliano Etere
massimili...@programmando.org
http://www.programmando.org

Grazie, nona vevo notato il "tip" ora lo proverò.
Il ping non voglio usarlo sia per quel che giàò ti ha commentato Andrea
Laforgia, sia perchè il server che pinga potrebbe per motivi suoi essere
down....e il rpogramma non può andarci di mezzo. Inoltre un programma
distribuito in centinaia di copie di cui ogni copia deve pingare ogni 2
secondi per vedere se è in rete mi manderebbe in Denial Of Service il
server...non voglio smurfarmi da solo ;o))


 end;
E se un computer fosse in rete locale e non in internet? Avesse dunque un
indirizzo IP per una "intranet"?
E se avesse due schede di rete (caso reale) una per fastweb per esempio e
una per la rete interna?
SImpatica come idea comunque, ci penderò...


secondi 
??? a che ti serve pingare ogni 2 secondi ???


> ??? a che ti serve pingare ogni 2 secondi ???
Dovendo garantire che il programma NON APPENA IL PC SI CONNETTE si esegua
subito, non posso che, se utilizzo il ping come "sensore di connesisone",
dover pingare continuamente per potermi accorgere non appena il pc è in
rete. :(


rete. :(
Assurdo, a mio avviso.  Trova un sistema migliore (vedi NetDetect di
ICQ che credo sia condivisibile da altre applicazioni).  Se le
connessioni sono RAS si può avere una notifica dell'inizio di un
tentativo di connessione da parte del sistema.


 remoto.
Beh, con due linee di codice in piů catturi ed elimini quella finestra ...
--
- Carlo -

 SImpatica come idea comunque, ci penderò...
certo che stressi è??? :)
è un vecchio esempio della mia collezione personale...


 Non esiste un qualcosa più "universale" per tutti i tipi di connesione?
E qui ricadiamo sul famoso vecchio discorso ... che intendi per "connesso ad
internet"?
Se cerchi su groups google ne troverai a decine di discussioni come questa.
Pingare più server noti può essere un' ottima soluzione ... poi vedi te
--
- Carlo -

Beh, con due linee di codice in più catturi ed elimini quella finestra ...
?
Il problema è che la finestra si apre...


 Il problema č che la finestra si apre...
Ho capito, dicevo che come problema non č di difficile soluzione. Basta
dedicare due righe di codice alla terminazione della stessa ed il gioco č
fatto. Forse si riesce a terminarla ancora prima che venga ridisegnata a
video.
Ad ogni modo questi sono argomenti triti e ritriti, un salto su gruppi
google sarebbe stato piů che sufficiente a trovare le risposte ...
--
- Carlo -

Ho capito, dicevo che come problema non è di difficile soluzione. 
Il problema è che la finestra si apre, la soluzione è non farla
aprire, non chiuderla se si apre (anche perché avresti un flickering
inutile e fastidioso).  


 (anche perché avresti un flickering inutile e fastidioso).
Il flickering ci sarebbe solo se la sua chiusura avvenisse dopo che la
stessa finestra è stata ridisegnata. Se si riesce ad anticipare la sua
visualizzazione (cosa per altro detta nel mio precedente messaggio) il gioco
è fatto.
--
- Carlo -

 Pingare più server noti può essere un' ottima soluzione ... poi vedi te
Per le ragioni già esposte nel thread il metodo è inapplicabile.


 tentativo di connessione da parte del sistema.
L'inizio potrebbe avvenire ad avvio del computer per chi ha una connessione
tipo Fastweb e avvenire prima che il programma si carichi nella taskbar, per
questo non funzionerebbe questa notifica di avvio connessione RAS. :(


 In Windows non è possibile impedire ad una finestra di "aprirsi".
chi ha sentito parlare del CBT_HOOK?
Andrea

 chi ha sentito parlare del CBT_HOOK?
Certo, ne ho anche costruiti diversi, ma non vedo l' attinenza.
Tu puoi intercettare, catturare, agganciare (da cui hooks) qualsiasi evento
di sistema, ma non puoi inibirlo prima della nascita.
Se il CBT_HOOK intercetta un' evento significa che lo stesso ha avuto luogo.
--
- Carlo -

 è fatto.
Ok, fallo e poi ne riparliamo.
--------------------------------
Inviato via 
http://usenet.libero.it

 Ok, fallo e poi ne riparliamo.
Come vuoi! ;-) Nel vero senso della parola, te lo ho fatto. Sorpreso della
velocità! :-p
Io ho optato per uno hook per evitare un "polling" continuo, però è
fattibile con altre strade! Se vuoi provarlo guarda il codice e modifica
nella DLL if GetCaption(WPar) = 'Connessione a Wind Infostrada ADSL'  con if
GetCaption(WPar) = 'Caption che mi interessa' ... ah, quasi dimenticavo, non
ci sono problemi di flickering! Tutto risolto con 1 chiamata ...
-- Codice DLL --
library shellDLL;
uses
  SysUtils,
  ClipBrd,
  Messages,
  Windows;
{$R *.RES}
var
hHook : THandle;
WM_NOTIFY: Cardinal;
Function GetCaption ( WindowsHandle: THandle ): String;
Var WText : PChar;
begin
  GetMem(WText,GetWindowTextLength(WindowsHandle));
  GetWindowText(WindowsHandle,WText,GetWindowTextLength(WindowsHandle)+ 1);
  Result:=String(WText);
  FreeMem(WText);
end;
Function ShellProc(nCode:Integer; WPar : Wparam; LPar :Lparam) : Integer;
Stdcall;
var TempString: String;
Begin
   if (nCode = HSHELL_WINDOWCREATED) then begin
   if GetCaption(WPar) = 'Connessione a Wind Infostrada ADSL' then begin
          LockWindowUpdate(GetDesktopWindow());
          SendMessage(WPar, WM_CLOSE, 0, 0);
          PostMessage(HWND_BROADCAST,WM_NOTIFY,0,0);
          LockWindowUpdate(GetDesktopWindow());
       end;
   end;
   if (nCode < 0) then
      Result := CallNextHookEx(hHook,nCode,WPar,LPar);
end;
Procedure Load; stdcall;
Begin
   hHook:=SetWindowsHookEx(WH_SHELL,@ShellProc,hInstance,0);
end;
Procedure Remove; stdcall;
Begin
   UnHookWindowsHookEx(hHook);
end;
Exports
Load,Remove;
begin
     WM_NOTIFY:=RegisterWindowMessage('MyMessage');
end.
-- Codice Progetto --
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    CaricaHook: TButton;
    RimuoviHook: TButton;
    ListBox1: TListBox;
    procedure CaricaHookClick(Sender: TObject);
    procedure RimuoviHookClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure MessageHandler(var Messaggio:TMsg; var ToHandle: boolean);
    { Private declarations }
  public
    { Public declarations }
  end;
Procedure Load;   stdcall; External 'ShellDLL.DLL';
Procedure Remove; stdcall; External 'ShellDLL.DLL';
var
  Form1: TForm1;
  WM_NOTIFY: Cardinal;
implementation
{$R *.DFM}
procedure TForm1.MessageHandler(var Messaggio:TMsg; var ToHandle: boolean);
begin
  if (Messaggio.message = WM_NOTIFY) then
      ListBox1.items.add('Dialer eliminato');
end;
procedure TForm1.CaricaHookClick(Sender: TObject);
begin
  Load();
end;
procedure TForm1.RimuoviHookClick(Sender: TObject);
begin
  Remove();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MessageHandler;
  WM_NOTIFY := RegisterWindowMessage('MyMessage');
end;
end.
--
- Carlo -

 ha scritto nel messaggio
news:LVN%9.176021$AA2.7...@news2.tin.it...


Ma... scusate se mi intrometto...
non sono molto pratico di delphi, ho cominciato da pochissimo.
Il post mi ha interessato molto più come esercizio mentale (và buttiamola li
ehehehe)
La domanda che mi pongo è... ma non è possibile risalire alla connessione,
presente/assente, da un comando di tipo netstat?
Voglio dire, se sono connesso ad internet ho determinate porte aperte e il
netstat se ne accorge no?
Per quanto riguarda i proxy, questi di solito comunicano su porte "standard"
a meno di un bizzarro amministratore, mi riferisco per esmpio alle 1080 per
i socks o alle 3128 per winproxy (mi sembra anche wingate), ma poi alla fine
basterebbe verificare le più utilizzate, o più semplicemente, in fase di
scelta delle opzioni del programma farsi dire dall'utente su che porta è il
proxy, o se possibile reperirlo dalla configurazione di explorer.
Correggetemi se sbaglio, ma anche se l'utente non ha aperto il browser la
porta del proxy rimane in listering no?
Tra l'altro il comando netstat non comporta nessuna apertura di finestre
varie....
Sarebbe attuabile o vaneggio data la mia inesperienza?
Ciao
grazie d'avermi sopportato