Delphi 7 CEF4

суббота, 11 сентября 2021 17:18:26, написал Admin

Настройка браузера Chromium на Delphi 7. Много лет назад была статья про dcef3. На днях столкнулся с проблемой, что ВК не пускает через dcef3. Стал разбираться, и понял, что надо переходить на версию cef4.

Настройка браузера Chromium на Delphi 7. Много лет назад была статья про dcef3 https://dmitxe.ru/blog/chromium.html

На днях столкнулся с проблемой, что ВК не пускает через dcef3. Стал разбираться, и понял, что надо переходить на версию cef4.  

Установка

Идем сюда https://github.com/salvadordf/CEF4Delphi качаем ветку мастер в zip архиве ну или клонируем себе. 

Сразу идем сюда https://www.briskbard.com/index.php?lang=en&pageid=cef и в разделе Links находим CEF binaries used by CEF4Delphi, качаем Windows x86 (32 bit)

Создаем папку dcef4 и распаковываем master.zip сюда c:\Program Files (x86)\Borland\Delphi7\Lib\dcef4\

Добавляем исходник кода через Tools/Environment Options/Library, новый путь к исходникам кода c:\Program Files (x86)\Borland\Delphi7\Lib\dcef4\source

Открываем файл c:\Program Files (x86)\Borland\Delphi7\Lib\dcef4\packages\CEF4Delphi_D7.dpk и жмем Install

В папке с проектами (например D:\Projects) создаем папку bin и бросаем туда папки Releases и Resources из архива Windows x86 (32 bit). В папку же с проектами копируем demos. Открываем проект demos\Delphi_VCL\SimpleBrowser\ и компилируем его. 

Простейший проект

Основано на демо-примере SimpleBrowser

Создаем новый чистый проект, на форму бросаем кнопку, TTimer, и TChromiumWindow с новой вкладке в конце палитры.

Правим системный файл проекта .dpr

program Chromium;

{$I cef.inc} 

uses
  Forms,
  uCEFApplication,
  Main in 'Main.pas' {Form1};
 
{$R *.res}

begin
  //CefUserAgent:='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36';

  GlobalCEFApp := TCefApplication.Create;

  // In case you want to use custom directories for the CEF3 binaries, cache and user data.
  GlobalCEFApp.cache                := 'cef\cache';
  GlobalCEFApp.UserDataPath         := 'cef\UserData';

  if GlobalCEFApp.StartMainProcess then
    begin
		Application.Initialize;
		Application.CreateForm(TForm1, Form1);
		Application.Run;
    end;

  GlobalCEFApp.Free;
  GlobalCEFApp := nil; 
end.

В корне проекта я создал себе папку cef. И в корень же распаковал Releases и Resources из архива Windows x86 (32 bit)

Дальше урезанный код из демо (файл main.pas)

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces,
  uCEFWinControl, uCEFSentinel, uCEFLinkedWinControlBase;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    ChromiumWindow1: TChromiumWindow;
    Timer1: TTimer;
    BitBtn2: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);

    procedure FormShow(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);

    procedure ChromiumWindow1AfterCreated(Sender: TObject);
    procedure ChromiumWindow1Close(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);

  private
    // You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned.
    procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
    procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
    // You also have to handle these two messages to set GlobalCEFApp.OsmodalLoop
    procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
    procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;

  protected
    // Variables to control when can we destroy the form safely
    FCanClose : boolean;  // Set to True in TChromium.OnClose
    FClosing  : boolean;  // Set to True in the CloseQuery event.

    procedure Chromium_OnBeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean);
   public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  uCEFApplication;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ChromiumWindow1.LoadURL('https://vk.com/');
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := FCanClose;

  if not(FClosing) then
    begin
      FClosing := True;
      Visible  := False;
      ChromiumWindow1.CloseBrowser(True);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCanClose := False;
  FClosing  := False;

  // The browser will load the URL in AddressEdt initially.
  //ChromiumWindow1.ChromiumBrowser.DefaultURL := AddressEdt.Text;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  // For simplicity, this demo blocks all popup windows and new tabs
  ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup;

  // You *MUST* call CreateBrowser to create and initialize the browser.
  // This will trigger the AfterCreated event when the browser is fully
  // initialized and ready to receive commands.

  // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser
  // If it's not initialized yet, we use a simple timer to create the browser later.
  if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True;
end;

procedure TForm1.ChromiumWindow1Close(Sender: TObject);
begin
  FCanClose := True;
  PostMessage(Handle, WM_CLOSE, 0, 0);
end;

procedure TForm1.Chromium_OnBeforePopup(      Sender             : TObject;
                                        const browser            : ICefBrowser;
                                        const frame              : ICefFrame;
                                        const targetUrl          : ustring;
                                        const targetFrameName    : ustring;
                                              targetDisposition  : TCefWindowOpenDisposition;
                                              userGesture        : Boolean;
                                        const popupFeatures      : TCefPopupFeatures;
                                        var   windowInfo         : TCefWindowInfo;
                                        var   client             : ICefClient;
                                        var   settings           : TCefBrowserSettings;
                                        var   extra_info         : ICefDictionaryValue;
                                        var   noJavascriptAccess : Boolean;
                                        var   Result             : Boolean);
begin
  // For simplicity, this demo blocks all popup windows and new tabs
  Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end;

procedure TForm1.ChromiumWindow1AfterCreated(Sender: TObject);
begin
  Caption            := 'Simple Browser';
//  AddressPnl.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  if not(ChromiumWindow1.CreateBrowser) and not(ChromiumWindow1.Initialized) then
    Timer1.Enabled := True;
end;

procedure TForm1.WMMove(var aMessage : TWMMove);
begin
  inherited;

  if (ChromiumWindow1 <> nil) then ChromiumWindow1.NotifyMoveOrResizeStarted;
end;

procedure TForm1.WMMoving(var aMessage : TMessage);
begin
  inherited;

  if (ChromiumWindow1 <> nil) then ChromiumWindow1.NotifyMoveOrResizeStarted;
end;

procedure TForm1.WMEnterMenuLoop(var aMessage: TMessage);
begin
  inherited;

  if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := True;
end;

procedure TForm1.WMExitMenuLoop(var aMessage: TMessage);
begin
  inherited;

  if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
MouseEvent : TCefMouseEvent;
KeyEvent : TCefKeyEvent;
begin
MouseEvent.x := 225;
MouseEvent.y := 125;
ChromiumWindow1.ChromiumBrowser.Browser.Host.SendFocusEvent(true);
ChromiumWindow1.ChromiumBrowser.Browser.Host.SendMouseClickEvent(PCefMouseEvent(@MouseEvent), MBT_LEFT, false, 1);
Sleep(1);
ChromiumWindow1.ChromiumBrowser.Browser.Host.SendMouseClickEvent(PCefMouseEvent(@MouseEvent), MBT_LEFT, true, 1);

end;
end.

По клику на первой кнопке грузиться главная страничка ВК.

В конце кода – пример работы второй кнопки, которая делает клик в загруженный сайт.

 

Chromium Delphi cef4 Delphi
  

Поделиться статьей с друзьями:

  

Комментарии к статье