Win7以上 32/64位系统隐藏托盘图标
前两天有朋友找我,让帮忙写个小工具,隐藏windows的托盘图标,想想最近在家也不想做太复杂的事,也好几年没写过windows上的小工具了,就答应了。想来挺简单的事,没想到还是有点小插曲的。特地来博客园上记录一下,方便自己也方便大家。
隐藏托盘图标主要有如下5个步骤:
1.获取ToolbarWindow32窗口对象句柄,因为图标都在这里面。(有两个,用spy++找了好久才找全)
2.注入ToolbarWindow32进程,发送TB_BUTTONCOUNT/TB_GETBUTTON消息。
3.读取TBBUTTON和TRAYDATA结构体数据。(64位和32位差异比较大,网上基本上都是32位的,查看了msdn才搞清楚TBBUTTON的结构体,TRAYDATA的结构体基本上就靠查资料和结合数据猜)
4.设置NOTIFYICONDATA结构体。
5.完工。
--------------------------------------------------------------------------------------------------------------------------------------
详细过程,和示例代码如下:
1.获取ToolbarWindow32窗口句柄,ToolbarWindow32有2个,分别存在两个不同的父窗口下,代码如下:
a.“用户升级的通知区域”,获取代码如下:
hWnd1 = FindWindow(TEXT("Shell_TrayWnd"), NULL);
hWnd1 = FindWindowEx(hWnd1, , TEXT("TrayNotifyWnd"), NULL);
hWnd1 = FindWindowEx(hWnd1, , TEXT("SysPager"), NULL);
hWnd1 = FindWindowEx(hWnd1, , TEXT("ToolbarWindow32"), NULL);

b.“溢出通知区域”,获取代码如下:
hWnd2 = FindWindow(TEXT("NotifyIconOverflowWindow"), NULL);
hWnd2 = FindWindowEx(hWnd2, , TEXT("ToolbarWindow32"), NULL);

2.注入ToolbarWindow32进程,发送TB_BUTTONCOUNT/TB_GETBUTTON消息。
a.注入,因为ToolbarWindow32进程和当前进程不是同一个进程,TB_BUTTONCOUNT/TB_GETBUTTON是没法发送的,注入之后就可以发送了:
GetWindowThreadProcessId(hWnd, &dwProcessId);
hProcess = OpenProcess(PROCESS_ALL_ACCESS
|PROCESS_VM_OPERATION
|PROCESS_VM_READ
|PROCESS_VM_WRITE,
,
dwProcessId); // 打开目标进程
lpAddress = VirtualAllocEx(hProcess,, 0x4096, MEM_COMMIT, PAGE_READWRITE); //申请空间,发送消息之后,用来读取获取到的结构体数据
b.发送TB_BUTTONCOUNT/TB_GETBUTTON消息:
for(int i = ; i < dwButtonCount; i++)
{
SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)lpAddress); // 遍历发送TB_GETBUTTON消息,获取对应信息
...
}
3.读取TBBUTTON和TRAYDATA结构体数据,代码如下:
ReadProcessMemory(hProcess, lpAddress, &tb, sizeof(tb), ); // 远程读取TBBUTTON结构体信息
if(tb.iString != -)
{
TRAYDATA trayData;
WCHAR *pwsz = NULL;
ReadProcessMemory(hProcess, (LPVOID)tb.dwData, &trayData, sizeof(TRAYDATA), ); // 远程读取TRAYDATA结构体信息
...
}
4.设置NOTIFYICONDATA结构体:
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = (HWND)trayData.hWnd;
nid.uID = trayData.uID;
nid.uFlags = NIF_STATE;
nid.dwState = bShow?NIS_SHAREDICON:NIS_HIDDEN;
nid.dwStateMask = NIS_HIDDEN;
Shell_NotifyIcon(NIM_MODIFY, &nid);
5.完成。
源码下载地址:github
Win7以上 32/64位系统隐藏托盘图标的更多相关文章
- 最新精品 强势来袭 XP,32/64位Win7,32/64位Win8,32/64位Win10系统【国庆版版】
本系统是10月最新完整版本的Windows10 安装版镜像,Win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为Win10 Edge浏览器中国默认主页和搜索引擎,系 ...
- win7/win8 64位系统注册TeeChart8.ocx 控件---以及dllregisterserver调用失败问题解决办法
TeeChart控件就不多介绍了,很多朋友不知道开始怎么注册使用,尤其是在64位系统下如何注册的问题,具体如下: win7.win8 64位系统问题所在: 64位的系统一般都是可以安装32位程序的 ...
- (转)Win7 64位系统下 Retional rose 2003 安装及破解
网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...
- Win7 64位系统下 Retional rose 2003 安装及破解
网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...
- 关于32位程序在Win7&64位系统中连接Microsoft Excel数据源的问题
最近在新公司电脑上跑以前的selenium测试框架的时候,抛出了如下的错误 出现的是ODBC Driver问题:[Microsoft][ODBC Driver Manager] Data source ...
- Win7 64位系统上配置使用32位的Eclipse(转)
Win7 64位系统上配置使用32位的Eclipse 博客分类: Eclipse eclipse 最近工作电脑换成了64位的win7系统,之前个人电脑上安装的jdk和Eclipse都是32位的.而新 ...
- XP,32/64位Win7,32/64位Win8,32/64位Win10系统 【春节版】
本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...
- XP,32/64位Win7,32/64位Win10系统【电脑城版】
本系统是10月最新完整版本的Windows10 安装版镜像,Win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为Win10 Edge浏览器中国默认主页和搜索引擎,系 ...
- 【春节版】年度精品 XP,32/64位Win7,32/64位Win8,32/64位Win10系统
本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...
随机推荐
- Bruce Eckel:编程生涯(转载)
Bruce Eckel:编程生涯(转载) 说明:Bruce Eckel 著有大名鼎鼎的<Thinking in C++>和<Thinking in Java>.本文是他对程序员 ...
- 为什么Android的图片质量会比iPhone的差?
经常看到有人问:“安卓版微信发出去的图片怎么那么渣!比iPhone的差远了!”.不只是微信,很多应用安卓版的图片质量就是要比iPhone版逊色很多,这到底是怎么回事? 我们团队最初也纠结 ...
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- 深入学习golang(3)—类型方法
类型方法 1. 给类型定义方法 在Go语言中,我们可以给任何类型(包括内置类型,但不包括指针和接口)定义方法.例如,在实际编程中,我们经常使用[ ]byte的切片,我们可以定义一个新的类型: type ...
- 【Linux】文件特殊权限 SUID/SGID/Sticky Bit
linux中除了常见的读(r).写(w).执行(x)权限以外,还有3个特殊的权限,分别是setuid.setgid和stick bit 1.setuid.setgid 先看个实例,查看你的/usr/b ...
- 【转】Java之WeakReference与SoftReference使用讲解
Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中.这些类还提供了与垃圾收集器(garbage collector)之间有限的交互. 1.先“ ...
- android studio svn不显示问题
今天更新android studio SDK 重启后发现SVN功能没有了,工具栏也没有了更新提交按钮,刚开始以后是SVN程序可以不行了(在我的电脑提交更新没问题)我在官网下了最新1.9.4 打开and ...
- Django 源码小剖: 初探中间件(middleware)
因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装. BaseH ...
- css 单位转换
如今 css 的单位越来越多了,px, em, rem, 微信的小程序又出来个 rpx 可以用 less 自动生成需要的单位 但当你只是想把一个已有的页面转换成小程序时,可能更需要一个 px -> ...
- android 电量分析工具
.参考文章:https://developer.android.com/studio/profile/battery-historian.html 这篇文章讲的是如果dump 电量日子文件batter ...