Enviar tecla para um componente especifico
Boa tarde,
gostaria de saber como fazer pra fazer uma rolagem automatica de um TWebBrowser. Estou usando um TTimer, e quero que ele vá descendo o texto periodicamente. Nao achei nenhuma função do componente que faça isso.
Então tentei da seguinte forma:
Mas o SetFocus nao funciona, ele so desce o texto se eu clicar no WebBrowser para ele pegar o foco.
Não teria um jeito melhor? Talvez uma função expecifica do componente, ou um jeito de eu colocar o foco no webbrowser antes de enviar a tecla, ja que o .SetFocus não funciona.
Agradeço desde ja
Victor
gostaria de saber como fazer pra fazer uma rolagem automatica de um TWebBrowser. Estou usando um TTimer, e quero que ele vá descendo o texto periodicamente. Nao achei nenhuma função do componente que faça isso.
Então tentei da seguinte forma:
WebBrowser1.SetFocus; keybd_event(40,0,0,0);
Mas o SetFocus nao funciona, ele so desce o texto se eu clicar no WebBrowser para ele pegar o foco.
Não teria um jeito melhor? Talvez uma função expecifica do componente, ou um jeito de eu colocar o foco no webbrowser antes de enviar a tecla, ja que o .SetFocus não funciona.
Agradeço desde ja
Victor
Kohl
Curtidas 0
Respostas
Marcosrocha
22/08/2007
Amigo eu já fiz algo semelhante...
O código é um tanto complicado porque eu uso FindWindow para fazer isso...
Mas você consegue encontrar na net artigos e dicas sobre ´como pegar texto do Bloco de Notas´... se não conseguir encontrar me avise que eu procuro a rotina no meu arquivo morto... :D
O código é um tanto complicado porque eu uso FindWindow para fazer isso...
Mas você consegue encontrar na net artigos e dicas sobre ´como pegar texto do Bloco de Notas´... se não conseguir encontrar me avise que eu procuro a rotina no meu arquivo morto... :D
GOSTEI 0
Kohl
22/08/2007
Pesquisando na internet achei esse codigo pra enviar uma tecla para outra aplicação
Mas o problema eh que não eh outra aplicação, eh para o componente que esta no meu form. Eu vi que a função FindWindow retorna HWND, entao tentei fazer essa ´gambiarra´:
PostMessage( WebBrowser1.HWND, WM_KeyDown, VK_DOWN, 0 );
Mas nao funcionou.
Se tiver como postar o codigo que você tem, ou se alguem mais tem uma solução agradeço muito.
var myHandle : THandle; begin myHandle:= FindWindow( ´MyAppClass´, ´MyAppCaption´); if myHandle <> 0 then PostMessage( myHandle, WM_KeyDown, VK_DOWN, 0 ); end;
Mas o problema eh que não eh outra aplicação, eh para o componente que esta no meu form. Eu vi que a função FindWindow retorna HWND, entao tentei fazer essa ´gambiarra´:
PostMessage( WebBrowser1.HWND, WM_KeyDown, VK_DOWN, 0 );
Mas nao funcionou.
Se tiver como postar o codigo que você tem, ou se alguem mais tem uma solução agradeço muito.
GOSTEI 0
Marcosrocha
22/08/2007
kohl a lógica é a mesma amigo, o problema é percorrer os Handles até achar o que você quer, na net você acha uma função com While que percorre todos os componentes de uma Janela. Mas só a título de informação, seu código ficaria algo do tipo:
var myHandle : THandle; begin myHandle:= FindWindow(´TApplication´, ´MeuPrograma´); if myHandle <> 0 then begin myHandle := FindWindow(´TForm´, ´Form Navegador´); if myHandle <> 0 then begin myHandle := FindWindow(´TWebBrowser´, ´WebBrowser1´); if myHandle <> 0 then PostMessage( myHandle, WM_KeyDown, VK_DOWN, 0 ); end; end; end;
GOSTEI 0
Kohl
22/08/2007
Bom, andei procurando na internet, fiz uns testes e não consegui.
Me parece que não tem como, porque o WebBrowser tem um propriedade .HWND que retorna o seu Handle, mas nao funciona com o keybd_event. Já que ele tem um metodo, então eu tenho como conseguir o seu HWND. O FindWindow nao retornaria esse mesmo valor?
De qualquer forma nao consegui fazer funcionar ele.
Se tiver mais algo pra ajudar agradeço muito, no mais muito obrigado pela ajuda. Vou ver ainda se consigo, mas sem muitas esperanças.
Me parece que não tem como, porque o WebBrowser tem um propriedade .HWND que retorna o seu Handle, mas nao funciona com o keybd_event. Já que ele tem um metodo, então eu tenho como conseguir o seu HWND. O FindWindow nao retornaria esse mesmo valor?
De qualquer forma nao consegui fazer funcionar ele.
Se tiver mais algo pra ajudar agradeço muito, no mais muito obrigado pela ajuda. Vou ver ainda se consigo, mas sem muitas esperanças.
GOSTEI 0
Emerson Nascimento
22/08/2007
tente assim:
SendMessage(WebBrowser1.Handle, WM_VSCROLL, 1, 0); // pra descer
SendMessage(WebBrowser1.Handle, WM_VSCROLL, 0, 0); // pra subir
SendMessage(WebBrowser1.Handle, WM_VSCROLL, 1, 0); // pra descer
SendMessage(WebBrowser1.Handle, WM_VSCROLL, 0, 0); // pra subir
GOSTEI 0
Kohl
22/08/2007
emerson.en, infelizmente talbem nao funcionou. ele simplesmente nao sai do lugar. esse componente eh muito limitado, muito cheio de restrição.
sera que existe algum componente bom e gratuito para visualizacao de paginas html com css?
obrigado
sera que existe algum componente bom e gratuito para visualizacao de paginas html com css?
obrigado
GOSTEI 0
Marcosrocha
22/08/2007
kohl o Handle é um endereço de memoria de um componente... O problema deve ser o método que você tá usando... Tenta usar o ´SendMessage´.
GOSTEI 0
Kohl
22/08/2007
Bom, seguindo a minha primeira tentativa, resolvi procurar agora um jeito de focar o WebBrowser, ja q o keybd_event funcionava se eu clicasse na tela do WebBrowser.
Encontrei na internet esse codigo
Com ele, consigo ajustar o foco do documento html em si, nao do componente e enfim funcionou.
Muito obrigado a todos que ajudaram
Sem mais
Encontrei na internet esse codigo
uses ActiveX; -------------------- with WebBrowser1 do if Document <> nil then with Application as IOleobject do DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle, GetClientRect);
Com ele, consigo ajustar o foco do documento html em si, nao do componente e enfim funcionou.
Muito obrigado a todos que ajudaram
Sem mais
GOSTEI 0