Array
(
)

Redirecionar paginas web pelo Delphi 7

Janbaceiredo
   - 01 abr 2006

Holla a todos,

gostaria de saber como posso redirecionar uma pagina web pelo Delphi 7.
Estou fazendo um programa de restrição de navegação, nele eu já consigo fechar as paginas que nao estao restristas. Mais covenhamos, fechar a pagina web nao é muito legal. Dessa forma queria redirecionar essa pagina web para uma pagina offline dizendo que a pagina esta bloqueada.
Por esse motivo gostaria de saber qual seria a função da API do Windwos que posso utilizar para redirecionar uma pagina web.

Eu tentei usar o ShellExecute passando por parametro o Handle da janela que quero fechar mais o problema é, quando tenho mais de uma pagina aberta ele pega sempre a ultima janela, desprezando o HANDLE que eu passei.

Se alguem puder me ajudar agradeço,
Sem mais,
Antonio.


Kroki
   - 01 abr 2006

Olá.
Não posso passar o código completo para abrir no IE,mas estude esse exemplo onde é aberta uma página numa janela do Windows(abra uma pasta qualquer e deixa aberta);
procedure TForm1.Button1Click(Sender: TObject);
Var
Explorer, Worker, Bar, ComboEx, Combo, Edit : HWND;
Url : String;
begin
Edit := 0;
Explorer := FindWindow(´CabinetWClass´, nil);
If Explorer <> 0 Then Begin
Worker := FindWindowEx(Explorer, 0, ´WorkerA´, nil);
If Worker <> 0 Then Begin
Bar := FindWindowEx(Worker, 0, ´ReBarWindow32´, nil);
If Bar <> 0 Then Begin
ComboEx := FindWindowEx(Bar, 0, ´ComboBoxEx32´, nil);
If ComboEx <> 0 Then Begin
Combo := FindWindowEx(ComboEx, 0, ´ComboBox´, nil);
If Combo <> 0 Then Begin
Edit := FindWindowEx(Combo, 0, ´Edit´, nil);
End;
End;
End;
End;
End;
If Edit <> 0 Then Begin
showmessage(´Transferindo...´);
Url := ´www.kaillera.com´;
SendMessage(Edit, WM_SETTEXT, 0, Integer(Url));
SendMessage(Edit, WM_KEYDOWN, VK_RETURN, $011C001);
End;
end;

Acho que vc não vai ter dificuldade em modificar para oque vc deseja.
Espero ter ajudado.


Janbaceiredo
   - 01 abr 2006

Holla kroki,

vc me ajudou muito. Consegui setar barra de endereço do IE para ser redirecionado para a pagina de restrição.
Só estou tendo somente um problema. A constante virtual VK_RETURN não esta realizando o <ENTER> no ComboBoxEx32.
O endereço de redirecionamento fica fica todo selecionado no ComboBoxEx32 a espera do VK_RETURN, mais ele nao é realizado.

Você poderia me dar mais essa ajuda para poder resolver esse problema?
Estou mandando o código que fiz.

#Código


function SetUrl(Handle: THandle):Boolean; stdcall;
var
hWndIE, hWndIEChild : HWND;
Buffer : array[0..255] of Char;
Url: String;
begin
Url:= ´http://janbaceiredo.homelinux.com/Restrito.php´;

SendMessage(Handle, WM_GETTEXT, 255, integer(@Buffer[0]));

hWndIE := FindWindow(´IEFrame´, Buffer);
if hWndIE > 0 then
begin
hWndIEChild:= FindWindowEx(hWndIE, 0, ´WorkerW´, nil);
if hWndIEChild > 0 then
begin
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´ReBarWindow32´, nil);
if hWndIEChild > 0 then
begin
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´ComboBoxEx32´, nil);
if hWndIEChild > 0 then
begin
SendMessage(hWndIEChild, WM_SETTEXT, 255, Integer(Url));
SendMessage(hWndIEChild, WM_KEYDOWN, VK_RETURN, $011C001);
end;
end;
end;
end;
end;


Sem mais,
Antônio.


Kroki
   - 02 abr 2006

Ok vc venceu...;

Uses ...DDEman;


procedure TForm1.TrocaUrl;
var
DDE:TDDEClientConv;
begin
DDE:=TDDEClientConv.Create(Self);
with dde do begin
if DDE.SetLink(´IExplore´,´WWW_OpenURL´) then
RequestData(´http://janbaceiredo.homelinux.com/Restrito.php,,0xFFFFFFFF,0x3,,,´);
end;
DDE.Free;
end;


Janbaceiredo
   - 02 abr 2006

Kroki valeu pela ajuda.
Mas essa segunda solução proposta não resolve o meu problema. :(

#Código


procedure TForm1.TrocaUrl;
var
DDE:TDDEClientConv;
begin
DDE:= TDDEClientConv.Create(Self);
with dde do
begin
if DDE.SetLink(´IExplore´,´WWW_OpenURL´) then
RequestData(´http://janbaceiredo.homelinux.com/Restrito.php,,0xFFFFFFFF,0x3,,,´);
end;
DDE.Free;
end;


:?: :?: Porque :?: :?:

:arrow: Bom, isso porque posso ter mais de uma janela do IE aberta ao mesmo tempo. Essa segunda solução proposta por você, pega sempre a ULTIMA janela aberta e redireciona para o link que desejo. Isso eu já conseguia usando o ShellExecute dessa forma:
#Código

uses ShellApi;
...
ShellExecute(Handle, ´open´, ´http://janbaceiredo.homelinux.com/Restrito.php´, nil, nil, SW_SHOWNORMAL);


Tanto o ShellExecute e a solução proposta por você pega sempre a ultima janela aberta do IE e redireciona.


Eu preciso redirecionar somente a pagina que o usuario tentar acessar:
Vamos ao exemplo:
:arrow: O usuario possui tres paginas do IE aberta sendo elas:
- www.uol.com.br
- www.terra.com.br
- www.clubedelphi.net

:arrow: Vamos supor que o usuario abra mais duas paginas, são elas:
- www.pornografia.com.br
- www.clubedelphi.net/forum

Nesse exemplo preciso redirecionar a pagina numero 4.
:?: :?: Porque :?: :?:

Bom, porque defini que o endereço [u:9759b2da0e]www.pornografia com.br[/u:9759b2da0e]
é restrito e não devera ser acessado.
Dessa forma preciso redirecionar somente a pagina numero 4 para o endereço [u:9759b2da0e]http://janbaceiredo.homelinux.com/Restrito.php[/u:9759b2da0e].

Dessa forma a sua primeira sugestão é mais interessante.
Esse codigo que momentei com sua dica é perfeito para mim. Porque passou o HANDLE da janela que desejo redirecionar.
Meu unico problema é com relação a tecla <ENTER> VK_RETURN que não consigo que ela seja capitada. Já tentei com PostMessage, mas também não funcionou. :?


Se você puder me ajudar com relação essa tecla ficaria muito grato.

Sem mais,
Antônio.


Janbaceiredo
   - 02 abr 2006

Kroki,

consegui resolver meu problema. Adicionei mais duas verificaçoes nos campos COMBOBOX e EDIT.

Dessa forma consegui fazer a aplicação simular o <Enter> para redirecionar a pagina.
Abaixo segue o codigo atualizado e devidamente comentado para quem precisar da mesma funcionalidade.
#Código


{*****************************************************************************
* Procedimento para setar a URL a ser redirecionada *
****************************************************************************}
procedure SetUrlFromIE(Handle: THandle); stdcall;
var
hWndIE, hWndIEChild : HWND;
Buffer : array[0..255] of Char;
Url: String;
begin
Url:= ´http://janbaceiredo.homelinux.com/Restrito.php´;

// Pega o Caption da Janela
SendMessage(Handle, WM_GETTEXT, 255, lParam(@Buffer[0]));

// Procura pela janela do Internet Explorer com o Buffer do Caption
hWndIE := FindWindow(´IEFrame´, Buffer);

If hWndIE > 0 Then
Begin
// Pega o Handle do container do Internet Explorer
hWndIEChild:= FindWindowEx(hWndIE, 0, ´WorkerW´, nil);

If hWndIEChild > 0 Then
Begin
// Pega o Handle da Barra de Endereço do Internet Explorer
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´ReBarWindow32´, nil);

If hWndIEChild > 0 Then
Begin
// Pega o Handle do ComboBoxEx32 do Internet Explorer
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´ComboBoxEx32´, nil);

If hWndIEChild > 0 Then
Begin
// Pega o Handle do ComboBox do Internet Explorer
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´ComboBox´, nil);

If hWndIEChild > 0 Then
Begin
// Pega o Handle do Edit do Internet Explorer
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´Edit´, nil);

If hWndIEChild > 0 Then
Begin
// Seta a URL no campo Edit do Internet Explorer
SendMessage(hWndIEChild, WM_SETTEXT, 0, lParam(Url));
// Simula o precionamento da tecla <Enter>
// Pode ser usando tanto VK_RETURN ou $D
PostMessage(hWndIEChild, WM_KEYDOWN, $D, $1c0001);
End; // Fim - Verifica retorno Edit

end; // Fim - Verifica retorno Combo

end; // Fim - Verifica retorno ComboBoxEx32

end; // Fim - Verifica retorno ReBarWindow32

end; // Fim - Verifica retorno WorkerW

end; // Fim - Verifica retorno IEFrame

end;


Value pela ajuda,
Sem mais,
Antônio.


Kroki
   - 02 abr 2006

Legal que vc tenha achado a solução de seu prob.
Não se esqueça que vc deve fazer uma verificação tambem junto com um Handle ´CabinetWClass´ e fechá-lo ou a URL proibida ao ser digitada em uma janela qualquer vai abrir.


Paullsoftware
   - 03 abr 2006

É justamente isso que estou procurando, mais alguém poderia me explicar como ultilizo esse código :?: :?: :?:


Paullsoftware
   - 12 abr 2006

vc´s não podem me dar uma mãozinha, to precisando mesmo desse código...


Paullsoftware
   - 15 mai 2006

ninguém tem uma idéia de como posso usar esse código :?: :?: :?:


Kroki
   - 16 mai 2006

O janbaceiredo deveria responder porke ele usa desse jeito.
Fala oque vc ker pra ver se da para simplificar.


Paulocesar1301
   - 16 mai 2006

Estava no forum ontem e li este tópico...

fiz uma procedure, coloquei em um timer que já existe em um serverzinho que funciona nas máquinas de minha rede e funfou beleza...
...alguns que já tentaram acessar alguns sites proibidos ficaram p**** da vida :lol: ... mas o chefe adorou a novidade...

VLW Clubedelphi e associados

Abraços e Bons Códigos :wink:


Nerdex
   - 18 jul 2006

Pessoal;

A parte mais cruacial eu fiz hoje. Estou interceptando os eventos de
´OnChanges e OnEnters´ nas URLs do ComboBox do IE e trantando, onde, se for um site proibido, eu redireciono. Para isto utilizo estas 2 classes da TLB do Shdocvw:

WBEvents: TSHDocVwDWebBrowserEvents2;
ShellWinEvents: TSHDocVwDShellWindowsEvents;

Tudo funciona perfeitamente, mas detalhe: SÓ ESTÁ FUNCIONANDO NO BROWSER... Assim, minha dúvida é o seguinte: A solução acima pode ser adaptada para monitorar o Explorer também, pois utilizando o Explorer, como Browser nada fica monitorado e o meu prgrama vai pro espaço...

Poderia, alguém me ajudar?


Ranyeryfip
   - 18 jul 2006

NerdeX tenta isso, em vez de você mandar procurar por FindWindow(´IEFRAME´, etc), você manda procurar por FindWindow(´ExploreWClass´, etc), o restante do codigo é o mesmo que você usou para o IE.


Delphitotal
   - 29 jul 2006

Estou usando dessa forma:

var
Janela : THandle;
begin
Janela := FindWindow(nil, ´: : : PLAYBOY.COM.BR : : : - Microsoft Internet Explorer´);
SetUrl(Janela);

blz funciona perfeito .. mais não está servindo pra mim .. não teria como usar pelo endereço? ex: www.playboy.com.br em vez de pegar a janela?


Delphitotal
   - 29 jul 2006

Correção:

*não teria como pegar pelo endereço? ex: www.playboy.com.br em vez de pegar a janela?


Delphitotal
   - 29 jul 2006

up...


Ranyeryfip
   - 29 jul 2006

Olá amigo DelphiTotal, o nosso amigo amigo janbaceiredo praticamente jah respondeu sua pergunta e a resposta está neste mesmo tópico, no site about.delphi.com tem uma dica que unindo com a janbaceiredo fica blz o sistema, de bloqueio de url, agora é você usar sua criatividade e sair para o abraço.


Delphitotal
   - 30 jul 2006

Sim! eu encontrei essas funções lá no http://delphi.about.com/ >

http://delphi.about.com/library/weekly/aa060303b.htm

{ Retorna endereço das url´s ativas no IE }

#Código

function GetUrlFromIE (Handle: THandle; List: TStringList):
boolean; stdcall;
var
hWndIE, hWndIEChild : HWND;
Buffer : array[0..255] of Char;
begin
//get the window caption
SendMessage(Handle, WM_GETTEXT, 255, integer(@Buffer[0]));
//look for the Internet Explorer window with "Buffer" caption
hWndIE := FindWindow(´IEFrame´, Buffer);
if hWndIE > 0 then
begin
//try to get a handle to IE´s toolbar container
hWndIEChild := FindWindowEx(hWndIE, 0, ´WorkerW´, nil);
if hWndIEChild > 0 then
begin
//get a handle to address bar
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´ReBarWindow32´, nil);
if hWndIEChild > 0 then
begin
//finally, locate combo box and add its text to the list
hWndIEChild := FindWindowEx(hWndIEChild, 0, ´ComboBoxEx32´, nil);
if hWndIEChild > 0 then
begin
SendMessage(hWndIEChild, WM_GETTEXT, 255, integer(@Buffer));
//List.AddObject(Buffer,TObject(hWndIE));
List.Add(Buffer)
end;
end;
end;
end;
//continue enumeration
Result :=True;
end; (*GetUrlFromIE*)


implementei o código é talz .. retorna blz as urls ..

mais não sei verificar por exemplo usando essa função verificar se a url playboy (http://www.playboy.com.br) está ativa se estiver usar a função
do janbaceiredo SetUrlFromIE(Handle: THandle); stdcall;

se alguém puder ajudar..


Delphitotal
   - 30 jul 2006

up


Delphitotal
   - 30 jul 2006

up