CEF系列技术文章:菜单隐藏实现


核心逻辑与 ID 说明

CEF(Chromium Embedded Framework)中可通过硬编码指定菜单项 ID,结合菜单可见性判断接口,精准隐藏指定 Chrome 原生菜单;同时支持工具栏按钮的显隐控制,以下为核心实现与关键 ID 说明。

核心实现逻辑

通过定义默认隐藏的菜单项 ID 数组,在IsMenuItemVisible方法中校验目标 ID 是否在数组内,若匹配则返回false隐藏菜单;通过IsChromeAppMenuItemVisible接口接入 CEF 的菜单可见性判断流程,通过IsChromeToolbarButtonVisible控制工具栏按钮显隐。核心代码如下:

// 硬编码默认隐藏的菜单项ID(来自cef_command_ids.h)
static const int kDefaultHiddenMenuIds[] = {
  // 个人资料相关
  35039,  // IDC_PROFILE_MENU_IN_APP_MENU - 三点菜单中"您的 Chromium"个人资料菜单
  46100,  // IDC_PROFILE_MAIN_MENU - 个人资料主菜单
  // 关于/自定义Chrome
  40018,  // IDC_ABOUT - 关于 Chromium
  37350,  // IDC_CUSTOMIZE_CHROME - 更多工具→自定义Chrome
  40283,  // IDC_SHOW_CUSTOMIZE_CHROME_SIDE_PANEL - 自定义Chrome侧边栏
  40284,  // IDC_SHOW_CUSTOMIZE_CHROME_TOOLBAR - 自定义Chrome工具栏
  // Chrome推广功能
  40263,  // IDC_CHROME_TIPS - Chrome提示
  40264,  // IDC_CHROME_WHATS_NEW - Chrome新功能
  // Google Lens右键菜单
  40282,  // IDC_SHOW_GOOGLE_LENS_SHORTCUT - Google Lens快捷方式
  50124,  // IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE - 右键:使用Google搜索图片
  50127,  // IDC_CONTENT_CONTEXT_SEARCHLENSFORIMAGE - 右键:使用Google Lens搜索图片
  50134,  // IDC_CONTENT_CONTEXT_SEARCHLENSFORVIDEOFRAME - 右键:使用Lens搜索视频帧
  50174,  // IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH - 右键:Lens区域搜索
  50193,  // IDC_CONTENT_CONTEXT_LENS_OVERLAY - 右键:Lens覆盖层
};

// 校验ID是否在默认隐藏列表
bool IsInDefaultHiddenList(int command_id) {
  for (int id : kDefaultHiddenMenuIds) {
    if (id == command_id) return true;
  }
  return false;
}

// 判断菜单项可见性
bool IsMenuItemVisible(int command_id) {
  if (IsInDefaultHiddenList(command_id)) {
    LOG(INFO) << "=== Menu " << command_id << " (hardcoded): hidden";
    return false;
  }
  return true;
}

// CEF Chrome应用菜单可见性接口
bool NiceClientHandler::IsChromeAppMenuItemVisible(CefRefPtr<CefBrowser> browser, int command_id) {
  CEF_REQUIRE_UI_THREAD();
  if (!filter_chrome_commands_) return true;
  LOG(INFO) << "=== IsChromeAppMenuItemVisible: command_id=" << command_id;
  return IsMenuItemVisible(command_id);
}

// CEF 工具栏按钮可见性接口
bool NiceClientHandler::IsChromeToolbarButtonVisible(cef_chrome_toolbar_button_type_t button_type) {
  if (!filter_chrome_commands_) return true;
  switch (button_type) {
    case CEF_CTBT_AVATAR:
      LOG(INFO) << "=== Hiding Avatar button (CEF limitation: cannot intercept click)";
      return false;
    default:
      return true;
  }
}
 

修改CEF源码重新编译需要比较长的时间,我在Intel Ultra 5机器上8小时才完成编译,建议使用云电脑或者云服务器上进程编译。最近天翼云电脑在免费赠送高配云电脑,免费使用两个月,已实名的三网手机号即可扫码领取:

p2

 

如图,已经成功隐藏地址栏后面头像菜单,以及三个点菜单里面的关于chrome等菜单。

补充说明

  1. 所有 ID 均来自 CEF 源码的cef_command_ids.h文件,需确保 ID 与使用的 CEF 版本匹配;
  2. 可通过filter_chrome_commands_开关全局控制菜单过滤逻辑,关闭时将显示所有菜单项。
 
posted @ 2025-12-06 23:43  吃货膨胀  阅读(0)  评论(0)    收藏  举报