본문 바로가기

프로그래밍/Chromium(CEF4Delphi)

[Chromium] CEF4Delphi - 크롬브라우저 팝업메뉴 추가 및 실행

개요

  크롬 웹브라우저에서 오늘쪽 마우스 버튼을 클릭하여 나오는 팝업메뉴에 사용자 메뉴를 추가하고 실행 시킬 수 있다.

방법

   - TChromium.OnBeforeContextMenu 이벤트 핸들러 작성

   - 파라미터 "model  TCefMenuModel" 에 사용자 메뉴 항목 추가

 

const
  JSDEMO_CONTEXTMENU_EXECFUNCTION = MENU_ID_USER_FIRST + 1;
  EXECFUNCTION_MSGNAME = 'usermenu1'; 
 ...
procedure TForm1.Chromium1BeforeContextMenu(
  Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
  const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
  model.AddSeparator;
  model.AddItem(JSDEMO_CONTEXTMENU_EXECFUNCTION, '사용자 정의 메뉴');
end;

   - TChromium.OnContextMenuCommand 이벤트 핸들러 에서 CommandID에 해당 메뉴에 대한 실행 코드 작성

 

procedure TForm1.Chromium1ContextMenuCommand(
  Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
  const params: ICefContextMenuParams; commandId: Integer;
  eventFlags: Cardinal; out Result: Boolean);
var
  TempMsg : ICefProcessMessage;
begin
  Result := False;

  case commandId of
    JSDEMO_CONTEXTMENU_EXECFUNCTION :
      begin
        //실행 코드를 메시지 핸들러를 이용해 모듈화 시킴
        //이부분에서 작성된 사용자 Delphi코드는 프로그램에서 실행 된다.
        ShowMessage('실행코드2'); //이 코드는 실행됨.
        TempMsg := TCefProcessMessageRef.New(EXECFUNCTION_MSGNAME);
        Chromium1.SendProcessMessage(PID_RENDERER, TempMsg);
      end;
  end;
end;

// Chromium1.SendProcessMessage로 보내진 메시지는 "GlobalCEFApp : TCefApplication" 크롬AppApplication의 "OnProcessMessageReceived" 이벤트 핸들러가 받아서 처리한다.
procedure GlobalCEFApp_OnProcessMessageReceived(const browser       : ICefBrowser;
                                                const frame         : ICefFrame;
                                                      sourceProcess : TCefProcessId;
                                                const aMessage      : ICefProcessMessage;
                                                var   aHandled      : boolean);
var
  arguments: TCefv8ValueArray;
begin
  if (aMessage.name = EXECFUNCTION_MSGNAME) then
    begin
      //이 위치는 GlobalCEFApp 영역이기 때문에 
      ShowMessage('사용자메뉴 실행2');  //--이 위치에서는 UI 명령은 실행이 안된다.
      TRACE('사용자메뉴 실행2'); //none ui 코드는 실행 된다.
      if (GlobalCallbackFunc <> nil) then
        GlobalCallbackFunc.ExecuteFunctionWithContext(GlobalCallbackContext, nil, arguments);
      aHandled := True;
    end
   else
    aHandled := False;
end;

...
  //GlobalCEFApp 이벤트 핸들러에 등록
  GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived;