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浏览器中国默认主页和搜索引擎 ...
 
随机推荐
- 从Windows XP系统迁移到Windows 7,Windows 8开始
			
Microsoft在2014年4月8日结束了Windows XP的支持.您的公司准备好了吗?如果您还没有迁移到Windows 7或8,那就要抓紧时间了.从现在起将不再向XP系统提供安全修补程序,而仍然 ...
 - OpenBTS的安装(转)
			
OpenBTS source code可以在这里下载:http://sourceforge.net/projects/openbts/ OpenBTS入门的各种问题可以在这里找到答案:http://g ...
 - 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件
			
PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...
 - 使用Installutil安装系统服务方法
			
系统必须装有.net Framework2.0然后点击开始-运行输入以下指令即可完成相应操作安装服务:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Ins ...
 - Android UI系列-----Dialog对话框
			
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
 - HDU  4759  Poker Shuffle
			
Poker Shuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
 - axis2带list的报文,对象和xml的转换
			
import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.dom4j. ...
 - Swing How to make dialogues
			
There are two types of dialog: modal non-modal: must use JDialog directly Taken JFileChooser as Exam ...
 - denyhost防止SSH暴力破解
			
参考: http://blog.sina.com.cn/s/blog_593af2a70102vjnf.html denyhost 官网: http://denyhosts.sourceforge.n ...
 - Pro ASP.NET MVC –第六章 MVC的基本工具
			
在本章,我们将介绍每个MVC程序员"武器库"的三个重要工具:依赖注入容器.单元测试框架和mock工具.在本书,对于三个工具分别都只用了一种方式实现,但每个工具都还有其他的实现方式. ...