Newsgroup: it.comp.lang.delphi
Titolo: Inserimento automatico ID e Password

E' possibile fare in modo che un'applicazione Delphi inserisca in automatico ID e password richiesti da internet explorer per poter accedere ad una pagina http protetta da password di rete?
-- 
madbat870 
------------------------------------------------------------------------
View this thread: 
http://www.itsistemi.net/viewtopic-857115.html
Inviato via 
http://www.itsistemi.net

Ho capito che devo recuperare l'handle della finestra, e fin lě ce l'ho fatta, ma non riesco a capire come fare a trovare l'handle dei controlli della finestra (i due edit)...
Non capisco quali sono esattamente i parametri da passare a EnumChildWindows e cosa mi restituisce...


 
I parametri sono tre: l'HWND della finestra principale (di cui vuoi 
esaminare le child window), un puntatore ad una funzione ed
un parametro aggiuntivo di tipo longint.
In pratica devi creare una funzione che abbia un prototipo
ben preciso. La tua funzione viene lanciata una volta per
ogni child window della finestra principale (il termine
preciso e' funzione "callback", nel senso che viene
chiamata da windows non da codice tuo).
Il parametro aggiuntivo ti serve per passare alla funzione delle
informazioni specifiche in modo da poter usare la funzione
in piu' casi:
Il prototipo della tua funzione deve essere cosi:
function EnumProc(wnd: HWND; Param: integer): BOOL; stdcall;
Ogni volta che viene chiamata, wnd contiene l'hwnd di una
child window e param e' il parametro che hai specificato tu
nella EnumChildWindows.
Se la funzione restituisce True, windows continua fino a che
non ha finito le child window, se restituisce false si ferma.
Esempietto pratico (non testato) :
function EnumProc(wnd: HWND; Param: integer): BOOL; stdcall;
var
   buf: array[0..255] of char;
begin
   Result := True;
   GetClassName(wnd, buf, SizeOf(buf) - 1);
   ShowMessage( string(buf) );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   EnumChildWindows(printdialog1.Handle, @EnumProc, 100 );
end;
Altro esempietto pratico per l'uso di Param (non testato) :
function EnumProc(wnd: HWND; Param: integer): BOOL; stdcall;
var
   buf: array[0..255] of char;
   L : TListBox;
begin
   Result := True;
   L := TListBox(Pointer(Param));
   GetClassName(wnd, buf, SizeOf(buf) - 1);
   L.Items.Add( string(buf) );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   EnumChildWindows(printdialog1.Handle, @EnumProc,
       integer(pointer(ListBox1)) );
end;
ciao
Giacomo

I parametri sono tre: l'HWND della finestra principale (di cui vuoi
esaminare le child window), un puntatore ad una funzione ed
un parametro aggiuntivo di tipo longint.
In pratica devi creare una funzione che abbia un prototipo
ben preciso. La tua funzione viene lanciata una volta per
ogni child window della finestra principale (il termine
preciso e' funzione "callback", nel senso che viene
chiamata da windows non da codice tuo).
Il parametro aggiuntivo ti serve per passare alla funzione delle
informazioni specifiche in modo da poter usare la funzione
in piu' casi:
Il prototipo della tua funzione deve essere cosi:
function EnumProc(wnd: HWND; Param: integer): BOOL; stdcall;
Ogni volta che viene chiamata, wnd contiene l'hwnd di una
child window e param e' il parametro che hai specificato tu
nella EnumChildWindows.
Se la funzione restituisce True, windows continua fino a che
non ha finito le child window, se restituisce false si ferma.
Seguendo le tue indicazioni sono riuscito nel mio intento, nel senso
che riesco ad inviare i messaggi ai due edit e a mandare al bottone OK
il messaggio di pressione del tasto sinistro del mouse...
C'è però un altro problema: una volta lanciato il browser, prima che
io ho la necessità che alla comparsa di quella finestra la mia
applicazione automticamente se ne accorga e invii i messaggi...
Per fare ciò ho letto che sono necessarie complicate (almeno per me ;-P)
procedure di hook (di tipo WH_SHELL da quanto ho capito): io per
ovviare al problema ho inserito un timer che ogni mezzo secondo esegue
la procedura EnumWindows e confronta i titoli delle finestre presenti con quelli
della chiamata precedente: in caso i due risultati siano diversi controllo
se la nuova finestra comparsa è quella che mi interessa, ottenendo così
il suo handle e procedendo in modo automatico all'invio dei messaggi.
Mi rendo conto che il metodo da me utilizzato è molto poco elegante,
ma volevo sapere se mi conviene o meno cimentarmi nella soluzione che
richiede l'hook.
ciao
Giacomo
Ciao e grazie!


 richiede l'hook.
ciao.
Purtroppo non ho esperienza per questo tipo di problemi (WS_SHELL e
altro) quindi non sono in grado di darti una mano.
Prova a chiedere su it.comp.programmare.win32, la' di sicuro
possono darti suggerimenti.
ciao
Giacomo

Prova a chiedere su it.comp.programmare.win32, la' di sicuro
possono darti suggerimenti.
ciao
Giacomo
Ok, grazie per il suggerimento!
Ciao
