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

一、目标:

  • 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;
}
  • 效果:

在这里插入图片描述

五、优化

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143095.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

手脱简单upx

大一下的事情&#xff0c;补个档 手动脱壳の新年快乐 查壳&#xff0c;有壳&#xff0c;UPX X32dbg打开文件&#xff0c;查看初始断点 点击PUSHAD跟进&#xff0c;CTRL*设置EIP&#xff0c;开始F8步过&#xff0c;寻找ESP寄存器第一次单个变红的地址 此时的内存窗口 开始步过…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件&#xff0c;特此记一笔。 其中针对esp32s3各类参数设定&#xff08;用idf.py menuconfig)&#xff0c;做个记录。 CPU Frequency去240MHz&#xff08…

【H2O2|全栈】关于CSS(6)CSS基础(五)

目录 CSS基础知识 前言 准备工作 网页项目规范 创建项目 布局 补充一部分属性 outline border-radius 预告和回顾 后话 CSS基础知识 前言 本系列博客将分享层叠样式表&#xff08;CSS&#xff09;有关的知识点。 本期博客主要分享的是网页项目规范&#xff0c;ou…

VC++以资源方式打开可执行文件

刚看一个资料说可以在VC中&#xff0c;以资源方式打开可执行文件&#xff0c;然后它如果包含对话框一些资源&#xff0c;会呈现出来&#xff0c;可以把其他程序界面上的控件直接拷贝到自己程序&#xff1b; 但是操作了一下没有成功&#xff0c; 先新建一个空对话框准备拷贝东…

Linux运维篇-服务器简介

目录 前言服务器分类&#xff08;按服务器的机箱结构来划分&#xff09;台式服务器机架式服务器刀片式服务器 外观部件内部结构前面板前面板组件前面板接口说明前面板指示灯和按钮前面板指示灯/按钮说明 后面板后面板组件后面板接口说明后面板指示灯后面板指示灯说明 主板和 iB…

uni-app生命周期(三)

文章目录 一、uni-app的生命周期二、应用生命周期三、页面的生命周期函数1.简介2.页面加载时序介绍3.页面加载常见问题4.页面加载顺序4.部分生命周期介绍 四、组件的生命周期函数 一、uni-app的生命周期 应用生命周期&#xff08;整个App的生命周期&#xff09; 在app.vue里面…

C++之仿函数和虚函数

仿函数&#xff08;Functor&#xff09;和虚函数&#xff08;Virtual Function&#xff09;是 C 中两个不同的概念&#xff0c;它们在功能和使用场景上有显著的区别。 1. 仿函数&#xff08;Functor&#xff09; 定义&#xff1a; 仿函数&#xff08;也称为函数对象&#xf…

酒店布草洗涤-酒店分层管理编程实现--———未来之窗行业应用跨平台架构

一、添加楼层代码 未来之窗_人工智能_传送阵(添加楼层,客户信息,300,200) CyberWin_Dialog.layer(未来之窗传送,{type:"url",title:title,move:true,width:阵眼宽度"px",height:阵眼高度"px",id:未来之窗app_通用ID,mask:false,align:59,hidecl…

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

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

CCF202006_1

问题描述 试题编号&#xff1a;202006-1试题名称&#xff1a;线性分类器时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 题解&#xff1a; #include<bits/stdc.h>using namespace std; int n, m;struct Node {int x, y;char ch; }node[1010…

51单片机按键数码管(简单设计)

51单片机按键数码管是一个简单的设计项目&#xff0c;使用四位数码管进行显示&#xff0c;矩阵按键加独立按键输入&#xff0c;将读取到据显示在数码管上。 一、参考PCB图 二、参考代码 #include <reg51.h> // LED数码管引脚定义 sbit LED1 P2 ^ 0; sbit LED2 P2 ^ 1;…

spark读取数据性能提升

1. 背景 spark默认的jdbc只会用单task读取数据&#xff0c;读取大数据量时&#xff0c;效率低。 2. 解决方案 根据分区字段&#xff0c;如日期进行划分&#xff0c;增加task数量提升效率。 /*** 返回每个task按时间段划分的过滤语句* param startDate* param endDate* param …

基于Leaflet和天地图的直箭头标绘实战-源码分析

目录 前言 一、Leaflet的特种标绘库 1、特种标绘对象的定义 2、Plot基类定义 3、直线箭头的设计与实现 二、在天地图中进行对象绘制 1、引入天地图资源 2、标绘对象的调用时序 3、实际调用过程 三、总结 前言 在博客中介绍过geoman标绘的具体实现&#xff0c;使用Leaf…

Window Server 2019+ 安装 Docker

刚刚在等待下载的时候&#xff0c;发了篇文&#xff0c;然后发现直接下载docker用不了&#xff0c;看了官网说明发现&#xff1a;Docker 不支持Window Server!!!不要直接下载官网那里的安装包。 那个链接点进去了windows的指南&#xff0c;发现也有问题&#xff0c;给的脚本地…

数据结构:(OJ141)环形列表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

【数据类型】映射map

小明正在备考英语四级考试&#xff0c;但他的词典太厚了&#xff0c;他记不住哪个单词在哪里。 于是他准备开发一个可以直接找某单词在某页的应用。 但是&#xff0c;他不会做&#xff0c;整天十分烦恼。 好啦&#xff0c;进入正题&#xff0c;大家好&#xff0c;我是学霸小羊…

Kubernetes从零到精通(12-Ingress、Gateway API)

Ingress和Gateway API都是Kubernetes中用于管理外部访问集群服务的机制&#xff0c;但它们有不同的设计理念和适用场景。它们的基本原理是通过配置规则&#xff0c;将来自外部的网络流量路由到Kubernetes集群内部的服务上。 Ingress/Gateway API和Service Ingress/Gateway API…

Django后台管理复杂模型

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django框架…

ZLMediaKit Windows编译以及使用

1.运行ZLMediaKit 2.通过ffmpeg把视频源推流给ZLMediaKit 执行以下命令&#xff0c;将本地视频通过RTSP协议推流给ZLMediaKit。 ffmpeg -re -stream_loop -1 -i "D:\workplace\armgb\public\1.fileh264" -vcodec h264 -f rtsp rtsp://127.0.0.1/live/test 若想将本…

统信服务器操作系统【d版系统上Ansible工具】配置方法

在统信服务器操作系统d版本上进行安装Ansible工具的方法以及配置方法。 文章目录 准备环境功能描述安装与配置一、 安装ansible工具1. 直接 命令安装2. 验证安装结果3. 配置ssh免密登录二、Ansible使用1. 主机清单配置2. ansible命令3. ansible模块三、 playbook配置文件1. 执行…