TWebBrowser: Zoom + «режим одного окна» несовместимы

Что я пытаюсь:

Мне нужен TWebBrowser, который всегда увеличен (~140%) И сохраняет все ссылки в одном и том же веб-браузере (т. е. ссылки _BLANK должны открываться в одном и том же элементе управления браузера).

Как я это делаю:

Я установил FEATURE_BROWSER_EMULATIONв реестре на 9999, поэтому веб-страницы отображаются с помощью IE9. Я подтвердил, что это работает. Кроме того, я запускаю скомпилированную программу на новой установке Windows 7 с IE9, полностью обновленной через Центр обновления Windows.

Масштаб:

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  ZoomFac: OLEVariant;
begin
  ZoomFac := 140;
  WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;

Это работает отлично.

Открытие новых окон в том же элементе управления браузера:

По умолчанию TWebBrowser открывает новый IE, когда встречает ссылку, установленную для открытия в новом окне. Мне нужно, чтобы он оставался в моей программе/веб-браузере.

Здесь я многое перепробовал. Это работает для меня:

procedure TFormWeb.WebBrowser1NewWindow3(ASender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal;
  const bstrUrlContext, bstrUrl: WideString);
begin
  Cancel := True;
  WebBrowser1.Navigate(bstrUrl);
end;

я отменяю новое окно и вместо этого просто перехожу к тому же URL-адресу.

Другие источники на различных страницах в Интернете предполагают, что я не отменяю и вместо этого устанавливаю ppDisp на различные вещи, такие как WebBrowser1.DefaultDispathили WebBrowser1.Applicationи их варианты. . Это не работает для меня. Когда я нажимаю ссылку _BLANK, ничего не происходит. Это проверено на двух компьютерах (как Win7, так и IE9). Я не знаю, почему это не работает, потому что это, кажется, работает для других людей в Интернете.Может быть, это решит проблему?

Теперь проблема:

Когда я комбинирую эти 2 куска кода, он ломается!

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://wbm.dk/test.htm');
  // This is a test page, that I created. It just contains a normal link to google.com
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  ZoomFac: OLEVariant;
begin
  ZoomFac := 140;
  WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;

procedure TForm1.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch;
  var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext,
  bstrUrl: WideString);
begin
  Cancel := True;
  WebBrowser1.Navigate(bstrUrl);
end;

При переходе по ссылке (независимо от того, обычная она или _BLANK) в веб-браузере во время выполнения возникает эта ошибка:

First chance exception at $75F1B9BC. Exception class EOleException with message 'Unspecified error'. Process Project1.exe (3288)

Если я удаляю любую часть кода, она работает (без удаленного кода, очевидно) .

Может ли кто-нибудь помочь мне заставить обе вещи работать одновременно?

Спасибо за внимание!

Обновление:

Теперь это вопрос правильного захвата нового окна и сохранения его в том же элементе управления браузера. Код масштабирования в OnDocumentComplete, насколько я могу судить, не имеет к этому никакого отношения. Это вообще зум. Если элемент управления WebBrowser был увеличен (достаточно одного раза), код в NewWindow3 завершится с ошибкой «Неуказанная ошибка». Сброс уровня масштабирования до 100% не помогает.

При использовании кода масштабирования (ExecWB) что-то изменяется «навсегда» в WebBrowser, что делает его несовместимым с кодом в NewWindow3.

Кто-нибудь может это понять?

Новый код:

procedure TForm1.Button1Click(Sender: TObject);
var
  ZoomFac: OLEVariant;
begin
  ZoomFac := 140;
  WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.wbm.dk/test.htm');
end;

procedure TForm1.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch;
  var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext,
  bstrUrl: WideString);
begin
  Cancel := True;
  WebBrowser1.Navigate(bstrUrl);
end;

Попробуйте щелкнуть ссылку до и после нажатия кнопки Button1. После масштабирования не получается.

6
задан TLama 27 June 2012 в 19:37
поделиться