Redirecionar paginas web pelo Delphi 7

01/04/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.


Janbaceiredo

Respostas

01/04/2006

Kroki

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.


Responder Citar

01/04/2006

Janbaceiredo

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.

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

  SendMessage(Handle, WM_GETTEXT, 255, integer(@Buffer&91;0&93;));

  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.


Responder Citar

02/04/2006

Kroki

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;


Responder Citar

02/04/2006

Janbaceiredo

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

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:
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 [b:9759b2da0e][u:9759b2da0e]www.pornografia com.br[/u:9759b2da0e][/b:9759b2da0e]
é restrito e não devera ser acessado.
Dessa forma preciso redirecionar somente a pagina numero 4 para o endereço [b:9759b2da0e][u:9759b2da0e]http://janbaceiredo.homelinux.com/Restrito.php[/u:9759b2da0e][/b: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> [b:9759b2da0e]VK_RETURN[/b:9759b2da0e] 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.


Responder Citar

02/04/2006

Janbaceiredo

Kroki,

consegui resolver meu problema. Adicionei mais duas verificaçoes nos campos [b:3213e92a14]COMBOBOX[/b:3213e92a14] e [b:3213e92a14]EDIT[/b:3213e92a14].

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

  // Pega o Caption da Janela
  SendMessage(Handle, WM_GETTEXT, 255, lParam(@Buffer&91;0&93;));

  // 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.


Responder Citar

02/04/2006

Kroki

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.


Responder Citar

03/04/2006

Paullsoftware

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


Responder Citar

12/04/2006

Paullsoftware

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


Responder Citar

15/05/2006

Paullsoftware

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


Responder Citar

16/05/2006

Kroki

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


Responder Citar

16/05/2006

Paulocesar1301

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:


Responder Citar

18/07/2006

Nerdex

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?


Responder Citar

18/07/2006

Ranyeryfip

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.


Responder Citar

29/07/2006

Delphitotal

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?


Responder Citar

29/07/2006

Delphitotal

Correção:

*não teria como [b:32c4cb196c]pegar[/b:32c4cb196c] pelo endereço? ex: www.playboy.com.br em vez de pegar a janela?


Responder Citar