PDA

View Full Version : Delphi & IExplorer


DaK_TaLeS
06-03-2005, 10:34
ciao.. sapresti darmi una mano nel costruire un app che refreshi la pagina di tutte le istanze di internet explorer e poi gli "mandi" il tasto Invio?

procedure TForm1.Button1Click(Sender: TObject);
var
IExplorer, Prev: THandle;
begin
prev:=0;
IExplorer:=FindWindow('IEFrame', nil);
while (IExplorer<>0)and(IExplorer<>Prev) do
begin
PostMessage(IExplorer, WM_KEYDOWN, VK_F5, 0);
PostMessage(IExplorer, WM_KEYUP, VK_F5, 0);
PostMessage(IExplorer, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(IExplorer, WM_KEYUP, VK_RETURN, 0);
Prev:=IExplorer;
IExplorer:=FindWindow('IEFrame', nil);
end;
end;

Io sono riuscito a costruire questa procedura ma non funziona..o meglio compila perfettamente ma non fa nulla :)
Però se provo a fare un postmessage con WM_CLOSE o simili funziona egregiamente quindi il problema è solo nel mandare il messaggio con il tasto premuto.
Ah ho winXp e Ie6.0

Qualche idea? grazie

kk3z
06-03-2005, 12:00
Prova ad usare SendInput o keybd_event

DaK_TaLeS
06-03-2005, 15:55
il keybd_event funziona solo se la finestra è in primo piano mentre a me serviva qualcosa che riuscisse a fare il tutto con IExplorer in background mentre io faccio dell'altro

cionci
07-03-2005, 17:44
Magari funziona con la SendMessage ed un messaggio WM_KEYDOWN seguito da un WM_KEYUP postato a tutte le istanze di IE...ma non ne sono sicuro...

71104
07-03-2005, 19:41
è esattamente quello che ha fatto lui, solo che con PostMessage anziché SendMessage.
x DaK_TaLeS:
il problema è che quella routine funziona solo con una finestra, la prima che è stata creata per l'esattezza: chiamate successive a FindWindow non trovano mai finestre diverse; facendo come fai tu probabilmente il tuo programma si pianta finché non chiudi la finestra di IE.
Se vuoi agire su tutte le finestre di IE esistono soluzioni:
1) enumeri tutte le finestre create sul sistema, ottieni di volta in volta il nome della classe, e se vedi che corrisponde a "IEFrame" agisci sulla finestra; oppure (metodo migliore ma più complessa)
2) enumeri tutti i processi, trovi tutte le istanze di iexplore.exe, enumeri i threads, e di ogni thread enumeri tutte le finestre; se si tratta di una "IEFRAME" ci fai quello che ci devi fare.

PS: la simulazione della pressione di F5 non è buona come tecnica; usa piuttosto:

PostMessage(hwndIE, WM_COMMAND, 41504, 0);