Как отключить опцию просмотра источника в Chromium Embedded?
Можно ли отключить параметр просмотра источника в Delphi Chromium Embedded?
Я не нашел ничего подходящего в списке свойств / методов.
2 ответа
Нет прямых настроек или событий, позволяющих скрыть пункты всплывающего меню Chromium. Однако у вас есть как минимум несколько вариантов продолжения, например, вы можете:
1. Скажите пользователю, что опция Просмотр источника запрещена, и откажитесь от действия
Вы можете решить, какие действия вы позволите или отклоните в OnMenuAction
обработчик события, где, если вы назначите True для Result
Параметр действие отклонено. Следующий код проверяет, что вы выполнили действие просмотра источника, и если да, отклоните действие и покажите информационное сообщение:
type
TCefMenuId = TCefHandlerMenuId;
procedure TForm1.Chromium1MenuAction(Sender: TObject;
const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean);
begin
if menuId = MENU_ID_VIEWSOURCE then
begin
Result := True;
ShowMessage('View page source is not allowed!');
end;
end;
2. Подделайте пункт меню к чему-то особенному, изменив заголовок пункта меню с его действием
Вы можете использовать пункт меню для чего-то другого, изменив заголовок пункта меню и выполнив некоторые пользовательские действия. В следующем примере кода показано, как изменить элемент меню представления источника на элемент меню about box:
type
TCefMenuId = TCefHandlerMenuId;
procedure TForm1.Chromium1GetMenuLabel(Sender: TObject;
const browser: ICefBrowser; menuId: TCefMenuId; var caption: ustring;
out Result: Boolean);
begin
if menuId = MENU_ID_VIEWSOURCE then
caption := 'About my application...';
end;
procedure TForm1.Chromium1MenuAction(Sender: TObject;
const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean);
begin
if menuId = MENU_ID_VIEWSOURCE then
begin
Result := True;
ShowMessage('About box...!');
end;
end;
3. Создайте свое собственное всплывающее меню страницы (фрейма)
Вы можете создать свое собственное всплывающее меню, но вы должны учитывать, что это меню довольно жестко запрограммировано, поэтому вам нужно будет поддерживать его, если вам нужно, чтобы оно было одинаковым с каждой новой версией оболочки Delphi Chromium. Вот код, как создать меню страницы без пункта меню просмотра источника:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, cefvcl, ceflib;
type
PCefMenuInfo = PCefHandlerMenuInfo;
type
TForm1 = class(TForm)
Chromium1: TChromium;
procedure FormCreate(Sender: TObject);
procedure Chromium1BeforeMenu(Sender: TObject; const browser: ICefBrowser;
const menuInfo: PCefMenuInfo; out Result: Boolean);
private
PageMenu: TPopupMenu;
procedure OnNavigateBackMenuItemClick(Sender: TObject);
procedure OnNavigateForwardMenuItemClick(Sender: TObject);
procedure OnPrintMenuItemClick(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.OnNavigateBackMenuItemClick(Sender: TObject);
begin
Chromium1.Browser.GoBack;
end;
procedure TForm1.OnNavigateForwardMenuItemClick(Sender: TObject);
begin
Chromium1.Browser.GoForward;
end;
procedure TForm1.OnPrintMenuItemClick(Sender: TObject);
begin
Chromium1.Browser.GetFocusedFrame.Print;
end;
procedure TForm1.Chromium1BeforeMenu(Sender: TObject;
const browser: ICefBrowser; const menuInfo: PCefMenuInfo;
out Result: Boolean);
begin
if menuInfo.typeFlags = MENUTYPE_PAGE then
begin
Result := True;
PageMenu.Items[0].Enabled := browser.CanGoBack;
PageMenu.Items[1].Enabled := browser.CanGoForward;
PageMenu.Popup(menuInfo^.x, menuInfo^.y);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
MenuItem: TMenuItem;
begin
PageMenu := TPopupMenu.Create(Self);
MenuItem := TMenuItem.Create(PageMenu);
MenuItem.Caption := 'Back';
MenuItem.OnClick := OnNavigateBackMenuItemClick;
PageMenu.Items.Add(MenuItem);
MenuItem := TMenuItem.Create(PageMenu);
MenuItem.Caption := 'Forward';
MenuItem.OnClick := OnNavigateForwardMenuItemClick;
PageMenu.Items.Add(MenuItem);
MenuItem := TMenuItem.Create(PageMenu);
MenuItem.Caption := '-';
PageMenu.Items.Add(MenuItem);
MenuItem := TMenuItem.Create(PageMenu);
MenuItem.Caption := 'Print';
MenuItem.OnClick := OnPrintMenuItemClick;
PageMenu.Items.Add(MenuItem);
Chromium1.Load('www.stackru.com');
end;
end.
сноска
Определения типов, используемые во всех примерах кода, присутствуют, потому что я заметил, что некоторые версии Delphi Chromium имеют неправильные определения обработчиков событий.
Возможно, что-то изменилось за последние годы, сегодня существует прямой метод:
uses
ceflib;
[..]
implementation
procedure TForm1.Chromium1BeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
//model.Clear;
model.Remove(Integer(MENU_ID_VIEW_SOURCE));
end;
Ты можешь использовать model.Clear
если вы хотите полностью избавиться от всплывающего меню.