当前位置: 首页 > news >正文

(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标:

  • windows中,打开chromium,任务栏中会出现一个chromium的图标。
  • 我们的目标是给这个图标的右上角,加上"有1条新消息"的小提示图标,也叫徽章(badge)
  • 注意:本章节纯属娱乐,有需要的集帅可以学习模仿。

具体效果如下:

在这里插入图片描述

二、修改源码:

  • 打开:\ui\views\view.cc
1.头部追加:
#include <Shobjidl.h>
#include <windows.h>
#include <shellapi.h>
2.找到:
bool View::OnMousePressed(const ui::MouseEvent& event) {return false;
}

OnMousePressed()函数是可以点击事件,每次点击浏览器头部时都会触发这个函数。

3.替换为:
void UpdateTaskbarIcon(HWND hwnd, HICON hIcon) {ITaskbarList3* pTaskbarList = nullptr;HRESULT hr = CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pTaskbarList));if (SUCCEEDED(hr)) {pTaskbarList->SetOverlayIcon(hwnd, hIcon, L"有1条新消息");pTaskbarList->Release();  LOG(ERROR) << "SetOverlayIcon成功调用"; }else{LOG(ERROR) << "ERRORERRORERROR"; }
}void SetTaskbarIconOverlay(HWND hwnd) {wchar_t className[256];GetClassName(hwnd, className, sizeof(className) / sizeof(wchar_t));LOG(ERROR) << "窗口类名"; LOG(ERROR) << className; LPCWSTR iconPath = L"C:/Users/Administrator/Desktop/favicon.ico";HICON hIcon = (HICON)LoadImage(NULL, iconPath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE);if (!hIcon) {MessageBox(hwnd, L"无法加载图标。", L"错误", MB_OK | MB_ICONERROR);} else {UpdateTaskbarIcon(hwnd, hIcon);}
}bool View::OnMousePressed(const ui::MouseEvent& event) {CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);LPCWSTR className = L"Chrome_WidgetWin_1";LPCWSTR windowName = nullptr; // 如果你不知道窗口的标题,可以设置为nullptr// 获取窗口句柄HWND hwnd = FindWindow(className, windowName);if (hwnd != NULL) {HWND parentHwnd = GetParent(hwnd);if (parentHwnd == NULL) {LOG(ERROR) << "hwnd 是一个顶级窗口"; } else {LOG(ERROR) << "hwnd 不是一个顶级窗口"; }}LOG(ERROR) << hwnd;wchar_t windowTitle[256];GetWindowText(hwnd, windowTitle, sizeof(windowTitle) / sizeof(wchar_t));LOG(ERROR) << "窗口标题"; LOG(ERROR) << windowTitle; bool isVisible = IsWindowVisible(hwnd);LOG(ERROR) << "isVisible"; LOG(ERROR) << isVisible; DWORD processId;GetWindowThreadProcessId(hwnd, &processId);LOG(ERROR) << "processId"; LOG(ERROR) << processId; SetTaskbarIconOverlay(hwnd);CoUninitialize();return false;
}

注意:

  1. 将ico图标位置(变量iconPath )替换成你图标的位置,必须是ico其他格式不行。
  2. LOG(ERROR)是用来打印错误日志的,可以忽略
  3. 最终实现原理是调用win32编程api里的SetOverlayIcon()函数。
4.编译
ninja  -C  out/Default chrome
  • 编译完成后,打开浏览器,一旦点击浏览器头部,图标就出现啦!

三、代码生成数字ico

  • 有的同学想到要右上角希望是数字图标,我们总不能准备99张ico图标吧。
  • 于是我们用代码在内存中生成ico

将上面的代码改成:

HICON CreateNumberIcon(int number) {if (number > 99) {number = 99;}// 创建一个16x16的位图HDC hdcScreen = GetDC(NULL);HDC hdcMem = CreateCompatibleDC(hdcScreen);BITMAPINFO bmi = {};bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmi.bmiHeader.biWidth = 16;bmi.bmiHeader.biHeight = -16; // 负值表示自上而下bmi.bmiHeader.biPlanes = 1;bmi.bmiHeader.biBitCount = 32; // 32位带透明通道bmi.bmiHeader.biCompression = BI_RGB;bmi.bmiHeader.biSizeImage = 0;bmi.bmiHeader.biXPelsPerMeter = 0;bmi.bmiHeader.biYPelsPerMeter = 0;bmi.bmiHeader.biClrUsed = 0;bmi.bmiHeader.biClrImportant = 0;void* pBits;HBITMAP hBitmap = CreateDIBSection(hdcMem, &bmi, DIB_RGB_COLORS, &pBits, NULL, 0);HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);// 设置背景为透明memset(pBits, 0, 16 * 16 * 4); // 初始化位图为透明// 设置字体和颜色HFONT hFont = CreateFont(14, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial");HFONT hOldFont = (HFONT)SelectObject(hdcMem, hFont);SetTextColor(hdcMem, RGB(255, 0, 0)); // 设置数字颜色为红色SetBkMode(hdcMem, TRANSPARENT);// 计算数字的居中位置std::wstring text = std::to_wstring(number);RECT rect = {0, 0, 16, 16};DrawText(hdcMem, text.c_str(), text.length(), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);// 清理SelectObject(hdcMem, hOldFont);DeleteObject(hFont);SelectObject(hdcMem, hOldBitmap);DeleteDC(hdcMem);ReleaseDC(NULL, hdcScreen);// 将位图转换为图标ICONINFO iconInfo = { TRUE, 0, 0, hBitmap, hBitmap };HICON hIcon = CreateIconIndirect(&iconInfo);DeleteObject(hBitmap);return hIcon;
}void UpdateTaskbarIcon(HWND hwnd, HICON hIcon) {ITaskbarList3* pTaskbarList = nullptr;HRESULT hr = CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pTaskbarList));if (SUCCEEDED(hr)) {pTaskbarList->SetOverlayIcon(hwnd, hIcon, L"新消息");pTaskbarList->Release();  LOG(ERROR) << "SetOverlayIcon成功调用"; }else{LOG(ERROR) << "ERRORERRORERROR"; }
}void SetTaskbarIconOverlay(HWND hwnd) {wchar_t className[256];GetClassName(hwnd, className, sizeof(className) / sizeof(wchar_t));LOG(ERROR) << "窗口类名"; LOG(ERROR) << className; //LPCWSTR iconPath = L"C:/Users/Administrator/Desktop/favicon.ico";//HICON hIcon = (HICON)LoadImage(NULL, iconPath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE);HICON hIcon = CreateNumberIcon(72);if (!hIcon) {MessageBox(hwnd, L"无法加载图标。", L"错误", MB_OK | MB_ICONERROR);} else {UpdateTaskbarIcon(hwnd, hIcon);}
}bool View::OnMousePressed(const ui::MouseEvent& event) {CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);LPCWSTR className = L"Chrome_WidgetWin_1";LPCWSTR windowName = nullptr; // 如果你不知道窗口的标题,可以设置为nullptr// 获取窗口句柄HWND hwnd = FindWindow(className, windowName);SetTaskbarIconOverlay(hwnd);bool isVisible = IsWindowVisible(hwnd);LOG(ERROR) << "isVisible"; LOG(ERROR) << isVisible; CoUninitialize();return false;
}
  • 效果:

在这里插入图片描述

五、优化

  • 还需要优化的是想改成,白色圆形,透明背景。但稍微尝试了下,没改对。
  • 就这样吧,调试太费时间了。题主懒,集帅自行优化吧

相关文章:

(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标&#xff1a; windows中&#xff0c;打开chromium&#xff0c;任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角&#xff0c;加上"有1条新消息"的小提示图标&#xff0c;也叫徽章(badge)注意&#xff1a;本章节纯属娱乐&#xff0c;有需要…...

JVM相关

1.JVM内存区域 一个运行起来的java进程就是一个Java虚拟机&#xff0c;就需要从操作系统中申请一大块内存。 内存中会根据作用的不同被划分成不同的区域&#xff1a; &#xff08;1&#xff09;栈&#xff1a;存储的内容是代码在执行过程中&#xff0c;方法之间的调用关系&a…...

9.18 微信小程序开发笔记

如何获取英语单词的发音&#xff0c;使其能在小程序界面通过点击外发&#xff1f; 1.通过外界API获取&#xff08;例如有道API&#xff09; 不下载音频文件&#xff0c;每次需要时直接API获取发音&#xff0c;存储压力小。但是一般的API都有使用次数限制&#xff0c;在背单词…...

dpdk课程学习之练习笔记八(dpvs的了解)

只是看到这个&#xff0c;跟着流程做一下练习&#xff0c;了解这个东东是干啥的&#xff0c;再就是搭建环境&#xff0c;基于dpdk的环境&#xff0c;顺手也就练习dpdk的环境搭建了。 0&#xff1a;总结 1&#xff1a;知道了lvs能实现的功能&#xff0c;挺强大。 2&#xff1…...

Linux标准IO-系统调用详解

1.1 系统调用 系统调用&#xff08;system call&#xff09;其实是 Linux 内核提供给应用层的应用编程接口&#xff08;API&#xff09;&#xff0c;是 Linux 应用层进入内核的入口。不止 Linux 系统&#xff0c;所有的操作系统都会向应用层提供系统调用&#xff0c;应用程序通…...

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…...

Unity携程Coroutine用法

一.携程概述 官方的解释是&#xff0c;携程允许你可以在多个帧中执行任务。在Unity中&#xff0c;携程是一个可以暂停并在后续帧中从暂停处继续执行的方法。 二.携程写法 下面示例使用携程和Update打印前5帧的时间间隔&#xff0c;展示了携程的基础写法 using System.Colle…...

腾讯百度阿里华为常见算法面试题TOP100(5):子串、堆

之前总结过字节跳动TOP50算法面试题: 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 子串 560.和为K的子数组...

「数据科学」清洗数据,真实数据集中缺失值的查看与处理

在数据科学的工作过程中&#xff0c;我们通过查看数据的基本要素和元数据之后&#xff0c;需要根据查看的结果&#xff0c;考虑是否需要清洗数据。缺失值的查看与处理&#xff0c;就是清洗数据的一部分。如果我们的数据集中&#xff0c;存在缺失值的话&#xff0c;就需要考虑如…...

彩蛋岛 销冠大模型案例

彩蛋岛 销冠大模型案例 任务&#xff1a; https://kkgithub.com/InternLM/Tutorial/tree/camp3/docs/EasterEgg/StreamerSales 视频 https://www.bilibili.com/video/BV1f1421b7Du/?vd_source4ffecd6d839338c9390829e56a43ca8d 项目git地址&#xff1a; https://kkgithu…...

大数据Flink(一百二十一):Flink CDC基本介绍

文章目录 Flink CDC基本介绍 一、什么是CDC 二、CDC的实现机制 三、​​​​​​​​​​​​​​传统 CDC ETL 分析 四、​​​​​​​​​​​​​​基于 Flink CDC 的 ETL 分析 五、​​​​​​​​​​​​​​什么是 Flink CDC 六、​​​​​​​​​​​​​​…...

SqlServer自定义类型的使用

目录 前言分类基于标量类型新建查询语句 用户定义的表类型新建查询语句 基于 CLR新建查询语句 前言 最近接触了SqlServer的自定义类型–TYPE&#xff0c;在此记录一下所得 分类 在 SQL Server 中&#xff0c;用户定义的类型&#xff08;User-Defined Types, UDT&#xff09;…...

LeetCode 滑动窗口 滑动子数组的美丽值

滑动子数组的美丽值 给你一个长度为 n 的整数数组 nums &#xff0c;请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为&#xff1a;如果子数组中第 x 小整数 是 负数 &#xff0c;那么美丽值为第 x 小的数&#xff0c;否则美丽值为 0 。 请你返回一个包含…...

【JavaEE初阶】多线程(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程安全的 第四个原因 代码举例: 分析原因 解决方法 方法1 方法2 wait(等待)和notify(通知) wait和sleep区别 线程安全的 第四个原因 内存可见性,引起的线程安全问…...

初识 C++ ( 1 )

引言&#xff1a;大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言&#xff0c;而C是面向对象语言&#xff0c;说C和C的区别&#xff0c;也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…...

Python数据分析 Pandas库-初步认识

Python数据分析 Pandas库-初步认识 认识Pandas ​ pandas是一个非常实用的Python工具&#xff0c;我们可以把它想象成一个超级强大的表格处理工具&#xff0c;它比Excel更智能&#xff0c;操作更为简单。pands可以从各种文件格式&#xff08;CSV、JSON、SQL、Excel&#xff0…...

Flutter问题记录 - 适配Xcode 16和iOS 18

文章目录 前言开发环境问题及解决方案1. Upload Symbols Failed2. type UIApplication does not conform to protocol Launcher3. method does not override any method from its superclass 最后 前言 为了新的镜像功能升级了macOS 15和iOS 18&#xff0c;Xcode也不可避免的需…...

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025 VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7.0U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链…...

大数相乘,大数相加

大数相乘&#xff1a; #include <iostream> #include <vector> #include <string>std::vector<int> multiply(const std::vector<int>& num1, const std::vector<int>& num2) {int n1 num1.size();int n2 num2.size();std::ve…...

Spring Boot配置文件敏感信息加密

一&#xff0c;背景 Spring Boot应用中的数据库、Redis、Nacos、MQ等的用户名、连接地址、密码在配置文件中一般都是明文存储&#xff0c;如果系统被系统攻破或者配置文件所在的目录读权限被破解&#xff0c;又或者是动态配置文件被窃取&#xff0c;内部人员或者黑客很容易通过…...

[智能体-81]:工程化智能体 = 模型做脑力拆解 + 框架做流程落地。前者是决策者,后者是管理者,tools/function call是内部员工;mcp server是外部资源;

一、全角色人设 & 对应技术组件角色定位对应技术模块核心职责决策者&#xff08;脑力大脑&#xff09;大模型 LLM理解目标、任务拆解、逻辑判断、分支决策、内容生成&#xff0c;负责 “想方案、定步骤”管理者&#xff08;流程总管&#xff09;智能体编排框架&#xff08;…...

孤舟笔记 互联网常用框架篇二 Dubbo服务请求失败怎么处理?集群容错策略你用过几种

文章目录先说结论Failover&#xff1a;换家店试试Failfast&#xff1a;不行就算了Failsafe&#xff1a;忘了这事Failback&#xff1a;回头再说Forking&#xff1a;同时点几家Broadcast&#xff1a;通知所有人怎么选择回答技巧与点评加分回答面试官点评个人网站分布式系统中&…...

打不开JupyterLab

因为安装某些依赖导致JupyterLab的依赖被动升级或降级&#xff0c;从而影响了JupyterLab的运行&#xff0c;此时可以SSH登录到实例&#xff0c;然后输入jupyter-lab命令进行确认&#xff0c;如果执行命令报错则说明是此问题&#xff0c;那么可以通过pip install jupyterlab再次…...

如何用Python脚本榨干百度网盘带宽:pan-baidu-download终极指南

如何用Python脚本榨干百度网盘带宽&#xff1a;pan-baidu-download终极指南 【免费下载链接】pan-baidu-download 百度网盘下载脚本 项目地址: https://gitcode.com/gh_mirrors/pa/pan-baidu-download 在数字时代&#xff0c;百度网盘已成为我们存储和分享大型文件的默认…...

车载诊断系统(OBD)的原理、演进与未来

本文约8,167字&#xff0c;建议收藏阅读 作者 | 北湾南巷 出品 | 汽车电子与软件 引 言 在现代汽车中&#xff0c;越来越多的故障不再表现为明显的机械损坏&#xff0c;而是以“亮灯”“报码”“性能异常”等电子信号的形式出现。发动机为什么亮起故障灯&#xff1f;排放是否达…...

终极指南:用D2DX让《暗黑破坏神2》在现代电脑上焕发新生

终极指南&#xff1a;用D2DX让《暗黑破坏神2》在现代电脑上焕发新生 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还在为经…...

PS5 NOR Modifier深度解析:如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版

PS5 NOR Modifier深度解析&#xff1a;如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版 【免费下载链接】PS5NorModifier The PS5 Nor Modifier is an easy to use Windows based application to rewrite your PS5 NOR file. This can be useful if your NOR is corru…...

抖音下载器深度解析:零基础轻松批量下载无水印视频

抖音下载器深度解析&#xff1a;零基础轻松批量下载无水印视频 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

UE4SS实战指南:虚幻引擎游戏脚本系统的深度解析与应用

UE4SS实战指南&#xff1a;虚幻引擎游戏脚本系统的深度解析与应用 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS …...

Python爬虫避坑手册:10年爬取经验总结,看完再也不会被封IP

做爬虫这么多年,我见过太多新手从入门到放弃,不是因为学不会Python,而是被各种反爬机制虐得怀疑人生。 我刚入行的时候,写的第一个爬虫是爬某电商网站的商品价格。当时觉得爬虫不就是发个请求,解析个HTML吗?结果代码刚跑了5分钟,IP就被封了。我当时还傻乎乎地重启路由器…...