Простой и правильный способ — использовать 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