如何禁用Chromium Embedded中的查看源代码选项?

7
有没有可能在Delphi Chromium Embedded中禁用查看源代码选项?在属性/方法列表中没有找到合适的内容。
2个回答

13

没有直接的设置或事件可以用来隐藏Chromium弹出菜单项。不过你至少有几个选项可以选择如何继续,例如:

1. 告诉用户查看源代码选项被禁止,并拒绝该操作。

你可以在OnMenuAction事件处理程序中决定允许或拒绝哪些操作,如果将Result参数分配为True,则该操作将被拒绝。下面的代码检查你是否执行了查看源代码操作,如果是,则拒绝该操作并显示信息消息:

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.通过更改菜单项的标题和执行自定义操作,将菜单项伪装成自定义内容。

您可以通过更改菜单项的标题并执行一些自定义操作来利用菜单项进行其他操作。以下示例代码显示了如何将查看源代码菜单项更改为关于框菜单项:

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 Wrapper中保持相同的菜单,就需要进行维护。以下是创建页面菜单而不包含查看源代码菜单项的代码:

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.stackoverflow.com');
end;

end.

所有代码示例中使用的类型定义是因为我注意到一些版本的 Delphi Chromium 具有错误的事件处理程序定义。


1
非常感谢您的帮助 ;) - Beny

2

也许随着时间的推移,事情发生了改变,而今天存在一种直接的方法:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接