2012-03-19 1 views
3

Мне нужно получить информацию о полосе прокрутки (положение, размер, видимость) управления внешним приложением Webbrowser, я попытался использовать функцию GetScrollBarInfo из моего предыдущего question, но функция всегда возвращает false, я проверил эту функцию с другим приложений и работает отлично, но не с IE или с помощью элемента управления Webbrowser. So how I can get information about the scrollbars of an Webbrowser control instance or the IE Webbrowser?Как я могу получить информацию о полосах прокрутки экземпляра управления Webbrowser или IE Webrowser?

+1

Что вы хотите сделать с этой информацией? какова ваша цель? просто любопытно ... – kobik

+0

Какие версии IE вы хотите, чтобы это работало, предполагая, что различная версия отличается в реализации –

+3

Приятная информация о http://theroadtodelphi.wordpress.com/2012/03/20/delphi-vcl-styles- and-twebbrowser-source-code-released/ – Ravaut123

ответ

4

Вот как вы можете узнать, видны полосы прокрутки или нет. Некоторая проверка ошибок пропущена для краткости.

LPDISPATCH  lpDispatch; 
lpDispatch  = m_Browser.GetDocument(); 

IHTMLDocument2 *doc2 = NULL; 
disp->QueryInterface(IID_IHTMLDocument2,(void**)&doc2); 

IHTMLElement *lpBodyElement; 
IHTMLBodyElement *lpBody; 

doc2->get_body(&lpBodyElement); 
if (lpBodyElement) 
{ 
lpBodyElement->QueryInterface(IID_IHTMLBodyElement,(void**)&lpBody); 
if (lpBody) 
{ 
    BSTR bstrText; 
      pBody->get_scroll(&bstrText); 
    lpBody->Release(); 
} 
lpBodyElement->Release(); 
} 
doc2->Release(); 

Возможные значения для bstrText являются «да», «нет», «Авто» (полосы прокрутки отображаются, когда содержание страницы превышает клиентскую область)

А вот как вы можете знать ток свиток положение:

IHTMLElement2 *pElement = NULL; 
hr = pBody->QueryInterface(IID_IHTMLElement2,(void**)&pElement); 
ASSERT(SUCCEEDED(hr)); 
ASSERT(pElement); 
long scroll_pos; 
pElement->get_scrollTop(&scroll_pos); 
+0

Я знаю об этом методе для извлечения информации о полосах прокрутки, но работает только тогда, когда приложениям принадлежит элемент управления WebBrowser, я ищу способ определить эту информацию из внешнего приложения. – Salvador

+4

Вы можете получить IHTMLDocument2 из HWND другого процесса, используя этот метод, описанный в MSDN - [Как получить IHTMLDocument2 из HWND] (http://support.microsoft.com/kb/249232) – BrendanMcK

+2

Если на странице используется ' 'then' body.scrollTop' всегда будет возвращать 0. Также свойство/атрибут 'scroll' больше не работает с режима стандартов IE8. – kobik

6

вы можете отправить WM_HTML_GETOBJECT сообщений для "Internet Explorer_Server" класса окна внешнего приложения для получения IHtmlDocument2, а затем с помощью IServiceProvider вы можете получить IWebBrowser2 интерфейс.
Вот некоторые примеры код в Delphi:

uses 
    ActiveX, MSHTML; 

type 
    TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; 
    wParam: wParam; out pObject): HRESULT; stdcall; 

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT; 
var 
    hInst: HWND; 
    lRes: Cardinal; 
    Msg: Integer; 
    pDoc: IHTMLDocument2; 
    ObjectFromLresult: TObjectFromLresult; 
begin 
    Result := S_FALSE; 
    hInst := LoadLibrary('Oleacc.dll'); 
    @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult'); 
    if @ObjectFromLresult <> nil then 
    try 
    Msg := RegisterWindowMessage('WM_HTML_GETOBJECT'); 
    SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes); 
    Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc); 
    if Result = S_OK then 
     (pDoc.parentWindow as IServiceprovider).QueryService(
     IWebbrowserApp, IWebbrowser2, IE); 
    finally 
    FreeLibrary(hInst); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Wnd, WndChild: HWND; 
    IE: IWebBrowser2; 
    Document: IHtmlDocument2; 
    ScrollTop, ScrollLeft: Integer; 
begin 
    Wnd := FindWindow('IEFrame', nil); // top level IE 
    if Wnd = 0 then Exit; 
    WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil); 
    if WndChild = 0 then Exit; 
    WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil); 
    if WndChild = 0 then Exit; 

    GetIEFromHWnd(WndChild, IE); 
    if IE <> nil then 
    begin 
    ShowMessage(IE.LocationURL); 
    Document := IE.Document as IHtmlDocument2; 
    ScrollTop := ((Document as IHTMLDocument3).documentElement as IHTMLElement2).scrollTop; 
    ScrollLeft := ((Document as IHTMLDocument3).documentElement as IHTMLElement2).scrollLeft; 
    ShowMessage(Format('%d;%d', [ScrollTop, ScrollLeft])); 

    // visible|hidden|scroll|auto|no-display|no-content 
    ShowMessage(OleVariant(Document).documentElement.currentStyle.overflowX); 
    ShowMessage(OleVariant(Document).documentElement.currentStyle.overflowY); 
    end; 
end; 

Edit: когда страница использует <!DOCTYPE> директивы для переключения IE6 строгого стандарта совместимого использования document.documentElement режима. (IHTMLDocument3) в предстандартном режиме, тело представляет собой прокручиваемую область , поэтому вы можете получить положение прокрутки с помощью document.body.scrollTop. В стандартном режиме элемент HTML прокручивается, , поэтому вы должны использовать document.documentElement.scrollTop.

Если document.documentElement.clientWidth <> 0 использует элемент documentElement для других объектов, используйте элемент body.
Полезные свойства, относящиеся к информации прокрутки, также являются clientHeight, scrollWidth, scrollHeight.

Смежные вопросы