Отключить контекстное меню в Chromium Embedded 3 (DCEF3)

Я пытаюсь отключить правую кнопку мыши (контекстное меню) в окне Chromium Embedded (DCEF3), но у меня не получается, я не нашел никаких настроек, чтобы сделать это изначально.

Я могу, например, отключить «Просмотр исходного кода», я использую код ниже, но я действительно хочу отключить контекстное меню или не хочу, чтобы оно появлялось.

Примечание. Я использую это в DLL «Chromium.dll», библиотеке, которая будет использоваться с «Inno Setup», эквивалентной Inno Web Browser.

procedure TInnoChromium.OnContextMenuCommand(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  const params: ICefContextMenuParams; commandId: Integer;
  eventFlags: TCefEventFlags; out Result: Boolean);
begin
if (commandId = 132) then Result := True; // MENU_ID_VIEW_SOURCE
end;

person D3F4ULT    schedule 05.09.2013    source источник


Ответы (2)


Чтобы отключить контекстное меню в DCEF 3, вам нужно обработать OnBeforeContextMenu событие и очистите его параметр model. Вот что говорится в ссылке (выделено мной):

OnBeforeContextMenu

Вызывается перед отображением контекстного меню. |параметры| предоставляет информацию о состоянии контекстного меню. |модель| изначально содержит контекстное меню по умолчанию. Модель| можно очистить, чтобы не отображать контекстное меню, или изменить, чтобы отображалось пользовательское меню. Не сохраняйте ссылки на |params| или |модель| вне этого обратного вызова.

Итак, чтобы полностью отключить контекстное меню, вы напишете что-то вроде этого:

uses
  cefvcl, ceflib;

type
  TInnoChromium = class
  ...
  private
    FChromium: TChromium;
    procedure BeforeContextMenu(Sender: TObject; const browser: ICefBrowser;
      const frame: ICefFrame;
  public
    constructor Create;
  end;

implementation

constructor TInnoChromium.Create;
begin
  FChromium := TChromium.Create(nil);
  ...
  FChromium.OnBeforeContextMenu := BeforeContextMenu;
end;

procedure TInnoChromium.BeforeContextMenu(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
  // to disable the context menu clear the model parameter
  model.Clear;
end;
person TLama    schedule 06.09.2013
comment
Пожалуйста! И да, проще некуда :-) Но, например. в CEF 1 было это more straightforward; в CEF 3 это не так очевидно. - person TLama; 06.09.2013
comment
Я видел этот пост на вашем CEF 1, хотя в DCEF3 это проще xD - person D3F4ULT; 06.09.2013

Примечание: в версии C++:

void ClientHandler::OnBeforeContextMenu(
    CefRefPtr<CefBrowser> browser,
    CefRefPtr<CefFrame> frame,
    CefRefPtr<CefContextMenuParams> params,
    CefRefPtr<CefMenuModel> model) {
  CEF_REQUIRE_UI_THREAD();

    //Clear disables the context menu
    model->Clear();
  }
}
person David Karlsson    schedule 02.03.2015
comment
CefContextMenuHandler::OnBeforeContextMenu(...) - person ALittleDiff; 06.01.2016