как программно в конце навигации TWebBrowser автоматически прокручивать до нужной позиции

Я хотел бы знать, как программно в конце навигации TWebBrowser (Delphi XE7) заставить его отображать страницу из верхнего левого угла (какая-то автоматическая прокрутка). По неизвестной причине веб-браузер прокручивается вправо в конце навигации.

Я пробовал все виды решений из сети. SendMessage является одним из них:

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

но ни один не работает. Есть идеи?


person Benoit Standaert    schedule 24.12.2015    source источник
comment
Можете ли вы показать нам, как воспроизвести это поведение   -  person David Heffernan    schedule 24.12.2015


Ответы (1)


Простой и правильный способ — использовать DOM, а не SendMessage для веб-браузера. например.:

var
  window: IHTMLWindow2;

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

Почему SendMessage(WebBrowser1.Handle, ...) не работает?

TWebBrowser.Handle не является дескриптором IE, которому вы должны отправлять сообщения. это окно-оболочка (Shell Embedding), содержащее окно IE с именем класса Internet Explorer_Server. В зависимости от версии 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;
person kobik    schedule 24.12.2015