C++ 隐藏系统托盘图标(支持XP-Win10)

C++ Win32系统托盘程序开发:从Shell_NotifyIcon到消息循环实战 在Windows桌面开发中,系统托盘是后台服务与工具软件常驻系统的重要界面组件。其核心原理基于Windows的消息驱动机制,通过Shell_NotifyIcon API与系统Shell进行通信,将图标注册到任务栏通知区域。技术实现关键在于正确处理NOTIFYICONDATA结构体版本、绑定隐藏窗口的消息循环以及自定义消息处理。掌握这些底层机制不仅能实现高度定制化的托盘功能,如动态图标更新和复杂右键菜单,更能深入理解Windows GUI编程的消息处理与资源管理逻辑。本文通过纯C++和Win32 API实战, 阅读详情
#include "stdafx.h"
#include <windows.h>
#include <CommCtrl.h>
#include <iostream>

BOOL IsWow64()
{
	BOOL bIsWow64 = FALSE;
	//IsWow64Process is not available on all supported versions of Windows.
	//Use GetModuleHandle to get a handle to the DLL that contains the function
	//and GetProcAddress to get a pointer to the function if available.
	typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
	LPFN_ISWOW64PROCESS fnIsWow64Process = reinterpret_cast<LPFN_ISWOW64PROCESS>(::GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process"));
	if (NULL != fnIsWow64Process)
	{
		if (!fnIsWow64Process(::GetCurrentProcess(), &bIsWow64))
		{
			//handle error
		}
	}
	return bIsWow64;
}

bool IsWindowsVersionOrGreater_(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{
	OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0,{ 0 }, 0, 0 };
	DWORDLONG        const dwlConditionMask = VerSetConditionMask(
		VerSetConditionMask(
			VerSetConditionMask(
				0, VER_MAJORVERSION, VER_GREATER_EQUAL),
			VER_MINORVERSION, VER_GREATER_EQUAL),
		VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);

	osvi.dwMajorVersion = wMajorVersion;
	osvi.dwMinorVersion = wMinorVersion;
	osvi.wServicePackMajor = wServicePackMajor;

	return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}

bool IsWindowsVistaOrGreater_()
{
	return IsWindowsVersionOrGreater_(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0);
}

HWND _FindOverflowToolbarWnd(void)
{
	HWND hToolBar = FindWindow(_T("NotifyIconOverflowWindow"), NULL);
	if (hToolBar == NULL)
		return NULL;
	return FindWindowEx(hToolBar, NULL, TOOLBARCLASSNAME, NULL);
}

HWND _FindToolbar32Wnd(void)
{
	HWND hToolBar = FindWindow(_T("Shell_TrayWnd"), NULL);
	if (hToolBar == NULL)
		return NULL;
	hToolBar = FindWindowEx(hToolBar, NULL, _T("TrayNotifyWnd"), NULL);
	if (hToolBar == NULL)
		return NULL;
	HWND hSyspagerWnd = FindWindowEx(hToolBar, NULL, _T("SysPager"), NULL);
	if (hSyspagerWnd == NULL)
		return NULL;
	return FindWindowEx(hSyspagerWnd != NULL ? hSyspagerWnd : hToolBar, NULL, TOOLBARCLASSNAME, NULL);
}

void ShowTrayIcon(HWND hToolbar,LPCTSTR lpwszIcon, BOOL bShow)
{
	//根据窗口句柄获取进程id
	DWORD dwProcessId;
	::GetWindowThreadProcessId(hToolbar, &dwProcessId);

	//托盘图标数量
	int nButtonCount = SendMessage(hToolbar, TB_BUTTONCOUNT, 0L, 0L);

	//打开进程
	HANDLE hProcess = ::OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId);

	//申请内存
	LPVOID lpTbbution = ::VirtualAllocEx(hProcess, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);

	//按钮信息
	TBBUTTON tButton;

	for (int i = 0; i < nButtonCount; i++)
	{
		//获取TBBUTTON信息
		SendMessage(hToolbar, TB_GETBUTTON, i, (LPARAM)lpTbbution);
		ReadProcessMemory(hProcess, lpTbbution, &tButton, sizeof(TBBUTTON), NULL);

		//获取标题长度
		DWORD nDesireLen = SendMessage(hToolbar, TB_GETBUTTONTEXT, tButton.idCommand, NULL);
		//在外部进程申请内存
		LPVOID lpTextAddress = ::VirtualAllocEx(hProcess, NULL, nDesireLen, MEM_COMMIT, PAGE_READWRITE);
		//获取标题内容到外部进程内存
		SendMessage(hToolbar, TB_GETBUTTONTEXT, tButton.idCommand, (LPARAM)lpTextAddress);

		//读出外部进程保存的标题内容
		TCHAR strTitle[MAX_PATH + 1] = _T("");
		ZeroMemory(strTitle, sizeof(strTitle));
		ReadProcessMemory(hProcess, lpTextAddress, &strTitle, sizeof(strTitle), NULL);

		//释放临时保存标题的内存
		::VirtualFreeEx(hProcess, lpTextAddress, nDesireLen, MEM_FREE);

		_tprintf(_T("idCommand : %d , title : %s \n"), tButton.idCommand, strTitle);

		if (_tcsstr(strTitle, lpwszIcon))
		{
			_tprintf(_T("idCommand : %d , title : %s \n"), tButton.idCommand, strTitle);

			BOOL bHide = (BOOL)SendMessage(hToolbar, TB_ISBUTTONHIDDEN, (WPARAM)tButton.idCommand, 0L);
			BOOL bResult = (BOOL)SendMessage(hToolbar, TB_HIDEBUTTON, (WPARAM)tButton.idCommand, MAKELPARAM(!bHide, 0));

			_tprintf(_T("bResult : %s \n"), bResult ? _T("TRUE") : _T("FALSE"));
		}
	}

	//释放内存
	::VirtualFreeEx(hProcess, lpTbbution, sizeof(TBBUTTON), MEM_FREE);
	CloseHandle(hProcess);
}

int main()
{
	setlocale(LC_ALL, "CHS");

	TCHAR *szTitle = _T("扬声器");

	//欢快的跑起来看看有没内存泄漏
	for (size_t i = 0; i < 1000; i++)
	{
		HWND hToolbar = _FindToolbar32Wnd();
		if (hToolbar != NULL)
		{
			ShowTrayIcon(hToolbar, szTitle, FALSE);
			if (IsWindowsVistaOrGreater_())
			{
				hToolbar = _FindOverflowToolbarWnd();
				if (hToolbar != NULL)
				{
					ShowTrayIcon(hToolbar, szTitle, FALSE);
				}
			}
		}
		Sleep(1500);
	}
		
	getchar();
	return 0;
}

Win10 系统下 Rational Rose 7.0 保姆级安装与避坑指南 本文提供Win10系统下Rational Rose 7.0的详细安装教程与常见问题解决方案。从获取正确的安装包、配置虚拟光驱,到处理许可证错误和兼容性问题,本指南涵盖了安装过程中的所有关键步骤和避坑技巧,帮助用户顺利完成这款经典UML建模工具的安装与配置。 阅读详情

相关推荐

小龙虾本地部署指南:小微餐饮离线点餐系统配置与实操

离线点餐系统是面向小微餐饮场景的轻量级本地化解决方案,其核心原理在于绕过云端依赖,采用SQLite嵌入式数据库与Electron+Python混合架构实现单机数据自治。技术价值体现在极低硬件门槛、零运维配置、强隐私合规性与高环境容错能力,适用于夜市摊位、私房菜馆等无IT人员的实体经营场景。典型应用包括扫码下单、口味标签管理、热敏小票打印及U盘加密备份。本文聚焦‘小龙虾’这一国产化离线点餐工具的Windows/macOS本地部署实践,涵盖真实可用配置底线、mDNS局域网协同机制及防油污/防高温/防误操作的工程

weixin_30861459的博客 418

[C++]隐藏/删除/显示托盘图标

研究了一下Windows的托盘,发现是个Toolbar,于是我们就可以用常用的消息对其进行处理,只是需要在Explorer.exe进程申请一块内存来保存数据

tzwsoho的专栏 4740

Windows Mobile嵌入式开发实操指南:ROM刷写与ActiveSync调试

Windows Mobile虽已退出主流,但在工业终端、物流手持设备及数字遗产保护等场景中仍广泛服役。其本质是基于ARM架构(如Intel PXA270、Samsung S3C2440)的轻量级嵌入式操作系统,依赖ActiveSync协议实现PC协同,并通过ROM镜像、注册表持久化和CAB包部署保障系统稳定性。技术价值在于离线可操作、无云依赖、强硬件绑定与高确定性响应——这使其成为严苛工业环境中的‘时间锚定系统’。典型应用场景包括工控面板维护、老款Symbol/Motorola采集终端升级、PIM数据迁移及

ciyinzhi8788的博客 717

C++ win32窗口应用程序隐藏任务栏图标/隐藏托盘图标

中托盘操作的方式并不是每次都生效,经过查询,发现托盘可能是写代码的人自己设置的,这种情况下需要自己处理。话不多说,直接上代码吧。

Winter_Sun灬的博客 1585

删除托盘图标的方法(适用于VC++ XP/WIN7系统)

在VC++编程中,我们经常需要在系统托盘中添加图标来实现各种功能。然而,在某些情况下,我们可能需要删除托盘中的残留图标。本文将介绍如何使用VC++编程在XP和Windows 7系统中删除残留的托盘图标。要实现这个目标,我们需要使用Windows API来访问系统托盘,并通过标识符识别和删除要删除的图标。结构体,设置了所需的字段,包括窗口句柄、图标标识符和回调消息。在上面的示例代码中,我们定义了一个托盘图标的标识符TRAY_ICON_ID,并在。消息,并在其中删除了托盘图标。最后,在主消息循环中,我们使用。

DevWizard的博客 688

隐藏右下角 托盘图标

隐藏右下角 托盘图标 隐藏右下角 托盘图标隐藏右下角 托盘图标隐藏右下角 托盘图标隐藏右下角 托盘图标 MFC 工程 吐血 整理

隐藏指定程序的托盘图标-64位Windows10适用

隐藏指定程序的托盘图标-64位Windows10家庭版适用1.现成的exe(在上面的链接里2.C/C++代码3.开机登陆后延时10S执行 强迫症笔者近来看到托盘里有几个程序,日常会使用到但是不会对其托盘图标进行操作,所以想把它们隐藏(保留程序功能),就查阅了一些资料,在此分享一下 注:代码从各个地方搜刮来debug得到,在64位系统上运行成功,32位应该不行)。 github: https://github.com/LCiZY/-HideTrayIcon 1.现成的exe(在上面的链接里 cmd下调用方式:

鲤工的鱼 8942

隐藏和显示Windows任务栏及托盘图标(VC 源码).rar

VC 隐藏和显示Windows任务栏及托盘图标,比较简单的例子,有兴趣的可参考下。

VC++ 控制托盘图标的显示或隐藏

//************************************ // 函数名称: SetingIcon // 返回类型: bool // 参数信息: // 函数说明:控制托盘图标的显示 //************************************ bool CMainWnd::SetingIcon(bool value) { HICON ...

weixin_30898109的博客 323

隐藏任意系统托盘图标程序

可以指定任意托盘图标,进行显示/隐藏操作,适合XP系统,为delphi6开发,可以多个图标同时显示/隐藏,可以选择带提示信息功能。

coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网

CorelDRAW X4 SP2是一个专业图形设计软件,专用于矢量图形编辑与排版,借助其丰富的内容和专业图形设计、照片编辑和网站设计软件,您将能够随心所欲地表达自己的风格与创意,轻松创作徽标标志、广告标牌、车身贴和传单、模型绘制、插图描画、排版及分色输出等。CorelDRAW X4 SP2软件特色CorelDraw X4 相比两年前的 CorelDraw X3 加入了大量新特性,总计有50项以上,...

weixin_30346025的博客 8883

Windows窗口管理革命:RBTray让你一键将任何窗口藏进系统托盘

还在为Windows任务栏上拥挤的窗口图标而烦恼吗?RBTray是一款轻量级的Windows后台程序,专门解决系统托盘最小化问题,让您可以将任何窗口一键隐藏到系统托盘区域,彻底释放宝贵的任务栏空间,打造清爽高效的工作环境。 ## 核心优势矩阵:为什么选择RBTray? ### 🚀 效率提升三重奏 RBTray通过三种简单直观的操作方式,满足不同用户的使用习惯,让窗口管理变得前所未有的便捷:

gitblog_00265的博客 390

论文精读-ReTransformer ReRAM-based Processing-in-MemoryArchitecture for Transformer Acceleration

Transformer已经成为一种流行的深度神经网络(DNN)模型,用于神经语言处理(NLP)应用,并在神经机器翻译、实体识别等方面表现出优异的性能。然而,其在自回归解码器中的规模化点积注意机制在推理过程中带来了性能瓶颈。Transformer也是计算和内存密集型的,需要硬件加速解决方案。

a284365的博客 1922

VC++ MFC系统托盘功能完整实现:从API原理到健壮封装

系统托盘是Windows桌面应用程序中实现后台常驻、前台隐身交互模式的核心组件,广泛应用于监控、通讯、下载管理等软件。其技术原理基于Windows Shell提供的标准API,通过NOTIFYICONDATA结构体定义图标属性,并调用Shell_NotifyIcon函数与系统任务栏进行通信。在VC++ MFC开发中,合理封装这一功能能显著提升代码复用性和程序健壮性。本文深入解析了托盘图标的消息响应机制、资源管理策略,并针对多显示器适配、高DPI缩放等实际工程挑战提供了解决方案。通过封装可复用的CSystem

weixin_30632883的博客 413

四足机械臂避坑指南:从URDF配置到逆运动学控制的完整流程

本文为四足机械臂(Loco-Manipulation)系统开发提供了一份详实的实战避坑指南。文章深入剖析了从URDF模型配置、核心控制循环设计到逆运动学(IK)求解与奖励函数构建的完整流程,重点讲解了如何避免关节命名错误、惯性参数设置不当、IK求解不稳定等常见陷阱,并强调了利用collision_bbox等可视化工具进行高效调试的方法,旨在帮助工程师构建稳定、高效的四足机械臂控制系统。

weixin_42509507的博客 191

Star CCM+ 实战:旋风分离器网格加密策略与湍流模拟优化

本文针对Star CCM+中旋风分离器模拟精度不足的常见问题,深入剖析了网格质量的关键影响。文章重点介绍了通过局部网格加密策略,精准优化旋流核心区与入口区域的网格密度,从而在保证计算效率的前提下,显著提升湍流模拟的准确性与流场细节的捕捉能力,为工程实践提供了一套有效的优化方案。

water的专栏 533

MFC程序托盘实现:Shell_NotifyIcon API详解与工业级实战

在Windows桌面应用开发中,系统托盘(System Tray)是后台服务与用户交互的关键界面组件,它基于Windows消息机制与Shell API实现。其核心原理是通过Shell_NotifyIcon函数与NOTIFYICONDATA结构体,向任务栏通知区域注册图标并接收鼠标事件,从而实现程序后台运行、状态提示与快速唤出。这项技术对于需要常驻后台的桌面工具(如即时通讯、下载管理、系统监控)具有重要价值,能显著提升用户体验与程序可用性。本文以MFC/VC++开发为背景,深入解析Shell_NotifyIc

weixin_34306593的博客 321

域控制器开发避坑实录:从硬件设计到软件集成的5个关键挑战

本文深入剖析了域控制器开发中的5大关键挑战,从硬件选型到软件集成,涵盖智能驾驶芯片选择、实时性优化、AUTOSAR架构适配等核心问题。通过实战案例和数据对比,为工程师提供避坑指南,助力提升开发效率和系统可靠性。

weixin_29258297的博客 394

U盘反复弹不出来?开源USB设备弹出工具USB-Disk-Ejector把“安全移除“变成一键的事

USB-Disk-Ejector 是一款开源、免安装的 Windows 工具,它的核心任务只有一件:帮你安全弹出 U 盘、移动硬盘和记忆卡,绕开那个反复出现的"该设备正在使用中"提示。程序体积不到 1.5MB,却能自动处理占用、区分读卡器、支持命令行,用过的老手大多会把它放进 U 盘随身带着走。 ## 你有没有过这样的瞬间 会议还有五分钟开始,你急着拔走 U 盘里的 PPT,系统却弹出一句冷冰

gitblog_01030的博客 350

同源策略与跨域

前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到。大致看了下腾讯云关于设置跨域访问的教程,按照前端同学给的域名等选项就给配了,而且测试下来也是好的。但是呢一直不知道什么是跨域这里就做一个简单的学习记录。 一、同源策略 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。...

mijichui2153的博客 1万+

用Excel或WPS做两独立样本的T检验

一般情况下收集数据时常用的是Excel或者WPS,但统计时却用SPSS等软件进行统计学分析,经常很多人找不到SPSS的安装包,或者苦于正版激活或忘记教程,其实Excel或WPS自带函数就足够了,均数、标准差以及统计检验都是一个函数而已。解释:先做F检验,如果F>0.05就做T检验,Ttset里的数据为两组的数据的比较,结果如下。A组的均数计算 =AVERAGE(B2:B6)A组的标准差计算 =STDEV(B2:B6)B组的标准差计算=STDEV(B7:B19)分组 数值 A组均数 A组标准差 p值。

Mrrunsen的博客 6751

无源码逆向完整指南:REA(reverse-engineer-anything)如何读透 APK 与原生二进制

同事只丢给你一个 APK,产品却追问:“那个分享按钮到底请求了哪个接口?”手里没有源码,这正是 reverse-engineer-anything(REA)解决的问题:你用自然语言提出需求,AI 编码助手替你完成无源码逆向分析,并且每个结论都附上可核查的证据。 ## 它能啃下什么、啃不下什么 - **原生可执行文件**(ELF、Mach-O 等):还原伪代码、字符串、符号与调用关系; - **

gitblog_00685的博客 928

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1345

3步重塑Windows操作体验:Open-Shell-Menu个性化配置全攻略

还在为Windows现代开始菜单的复杂操作而烦恼吗?Open-Shell-Menu(原Classic Shell)作为一款经典的开源工具,让Windows 7到Windows 11的用户都能重新拥抱高效、直观的操作界面。这不仅仅是一个菜单替换工具,更是你提升工作效率、个性化工作环境的得力助手。 ## 🔍 核心价值:为什么选择Open-Shell-Menu? ### 效率革命:回归熟悉的操作逻

gitblog_00508的博客 497

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

重塑Windows开始菜单体验:Open-Shell-Menu深度定制完全指南

厌倦了Windows现代开始菜单的繁琐操作?怀念经典Windows XP/7的简洁高效?Open-Shell-Menu(原Classic Shell)正是为你而生的开源解决方案。这个强大的工具集不仅能恢复经典开始菜单,还提供了资源管理器增强、IE浏览器优化等全方位Windows界面定制功能,让你在Windows 7到11的所有版本上都能享受个性化的操作体验。 ## 🎯 你的Windows界面痛

gitblog_00248的博客 342

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: C# 微软 SAPI.SpVoice 简单使用
下一篇: C++ 获取父进程PID
RootSuper
博客等级 码龄14年 79粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值