如何在TWebBrowser导航结束时以编程方式自动滚动到所需位置

时间:2015-12-24 08:26:51

标签: delphi delphi-xe7 twebbrowser

我想知道如何在TWebBrowser(Delphi XE7)的导航结束时以编程方式强制这一个从左上角显示页面(某种自动滚动)。由于未知原因,Web浏览器在导航结束时向右滚动。

我尝试了网上的各种解决方案。 SendMessage就是其中之一:

SendMessage(WebBrowser1.Handle, WM_HSCROLL, 0 , 0);

但没有效果。任何的想法?

1 个答案:

答案 0 :(得分:3)

简单而正确的方法是将Web而不是SendMessage用于WebBrowser。 e.g:

var
  window: IHTMLWindow2;

window := (WebBrowser1.Document as IHTMLDocument2).parentWindow;
window.scroll(0, 0);

为什么SendMessage(WebBrowser1.Handle, ...)无效?

TWebBrowser.Handle不是您应该发送消息的IE句柄。它是一个包装窗口(Shell Embedding),其中包含类名为Internet Explorer_Server的IE窗口。 根据IE版本和文档模式,结构可以是(使用Spy ++检查结构):

Shell Embedding
  Shell DocObject View
    Internet Explorer_Server <- send message to this window

您可以使用EnumChildWindows查找Internet Explorer_Server

function EnumChilds(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
  Server = 'Internet Explorer_Server';
var
  ClassName: array[0..24] of Char;
begin
  GetClassName(hwnd, ClassName, Length(ClassName));
  Result := ClassName <> Server;
  if not Result then
    PLongWord(lParam)^ := hwnd;
end;

function GetIEHandle(AWebBrowser: TWebbrowser): HWND;
begin
  Result := 0;
  EnumChildWindows(AWebBrowser.Handle, @EnumChilds, LongWord(@Result));
end;

发送消息:

IEHandle := GetIEHandle(WebBrowser1);
if IEHandle <> 0 then
begin
  SendMessage(IEHandle, WM_HSCROLL, SB_LEFT ,0);
  SendMessage(IEHandle, WM_VSCROLL, SB_TOP ,0);
end;