Веб-браузер и OLECMDID_SELECTALL

Когда я открываю веб-страницу Google, используя:

WebBrowser1.Navigate('http://www.google.com.au/advanced_search?hl=en');

он открывается с курсором в поле редактирования.
Итак, когда я использую:

WebBrowser1.ExecWB(OLECMDID_SELECTALL,OLECMDEXECOPT_PROMPTUSER,vaIn, vaOut);

он копирует только то место, где находится курсор. Не вся веб-страница, которую я хочу скопировать. мой код:

procedure Pause()
begin
//code to pause until page loads.
end;

procedure TForm2.Button22Click(Sender: TObject);
var s:String;
    vaIn, vaOut: OleVariant;
begin
    s:='http://www.google.com.au/advanced_search?hl=en';
    WebBrowser1.Navigate(s);
    while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
      begin
          Pause(1000);
      end;
//------->I need to put code here so the SELECTALL line of code works.<----------
//------->So the cursor isn't in to editbox but as if it has clicked  <---------- 
//------->the webpage                                                 <----------
    WebBrowser1.ExecWB(OLECMDID_SELECTALL,OLECMDEXECOPT_PROMPTUSER,vaIn, vaOut);
end;

Как выделить всю веб-страницу?


person Peter James    schedule 20.09.2012    source источник
comment
Можете ли вы использовать TWebBrowser.Document.Copy? docwiki.embarcadero.com/Libraries/en/ msdn.microsoft.com/en-us/library/aa752116.aspx msdn.microsoft.com/en-us/library/aa752127.aspx   -  person Arioch 'The    schedule 20.09.2012
comment
также посмотрите social.msdn. microsoft.com/Forums/en-US/vsto/thread/ social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/   -  person Arioch 'The    schedule 20.09.2012
comment
Что вы на самом деле пытаетесь сделать? скопировать содержимое этой страницы или что?...   -  person kobik    schedule 20.09.2012
comment
Тут даже не вопрос...   -  person Ondrej Kelle    schedule 20.09.2012
comment
Просто пытаюсь скопировать текст на веб-странице, а не код, который делает веб-страницу. Код, который я использую, работает, если на странице нет полей редактирования. Но если на странице есть поле редактирования и курсор находится в поле редактирования, оно не работает.   -  person Peter James    schedule 20.09.2012


Ответы (2)


Попробуйте сфокусировать тело, прежде чем выбирать все:

((WebBrowser1.Document as IHTMLDocument2).body as IHTMLElement2).focus();
WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut);

С учетом сказанного лучшим подходом было бы использовать document.body.innerText для захвата текста вместо имитации выбора/копирования, как вы.

person kobik    schedule 20.09.2012
comment
Кобик, ты гений. А еще смешной. Спасибо. - person Peter James; 20.09.2012
comment
Ага, спасибо за напоминание. Я нажал стрелку голосования вверх. Еще раз спасибо. У меня только 11 баллов в рейтинге репутации, поэтому мой голос не считается, мне нужно 15, прежде чем он проголосует. - person Peter James; 20.09.2012

http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/eef2f809-cadf-44a3-956e-e75925a4b85e предлагает явный способ выбрать все перед копированием. Этот способ напрямую работает только тогда, когда на странице нет фреймов (в Google Advanced есть IFRAME, а IHTMLBodyElement.CreateTextRange не работает)

Но такой код позднего связывания работает в XE2/Win7x64/IE9:

procedure TForm2.btn2Click(Sender: TObject);
var HTML_Doc, oRange: OleVariant;
begin
  HTML_Doc := WebBrowser1.Document;
  oRange := HTML_Doc.body.createTextRange;
  oRange.select();

  WB_Copy(webbrowser1);
end;

WBCopy взят из модуля WBFunks http://codingrus.ru/readarticle.php?article_id=721 и сводится к вызову ExecWB с параметрами OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT.

person Arioch 'The    schedule 20.09.2012
comment
Привет, Ариох. Спасибо за код, который я только что попробовал, и он работает. Но он копирует все содержимое страницы. Я просто хотел скопировать текст, который вы видите на экране, а не содержимое кода страницы. - person Peter James; 20.09.2012
comment
Привет TLama, ответ дал kobik. А именно:((WebBrowser1.Document as IHTMLDocument2).body as IHTMLElement2).focus(); WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut); - person Peter James; 20.09.2012
comment
Это зависит от того, как вы вставляете. Я считаю, что вы можете вставлять как HTML, так и обычный текст. Попробуйте то, что вставили в блокнот. В более сложных программах попробуйте Edit/paste special/format=plaintext - person Arioch 'The; 20.09.2012
comment
@james TLama сослался на предыдущий вариант ответа, а не на текущий - person Arioch 'The; 20.09.2012