前两天有朋友找我,让帮忙写个小工具,隐藏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位系统隐藏托盘图标的更多相关文章

  1. 最新精品 强势来袭 XP,32/64位Win7,32/64位Win8,32/64位Win10系统【国庆版版】

    本系统是10月最新完整版本的Windows10 安装版镜像,Win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为Win10 Edge浏览器中国默认主页和搜索引擎,系 ...

  2. win7/win8 64位系统注册TeeChart8.ocx 控件---以及dllregisterserver调用失败问题解决办法

    TeeChart控件就不多介绍了,很多朋友不知道开始怎么注册使用,尤其是在64位系统下如何注册的问题,具体如下: win7.win8  64位系统问题所在: 64位的系统一般都是可以安装32位程序的 ...

  3. (转)Win7 64位系统下 Retional rose 2003 安装及破解

    网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...

  4. Win7 64位系统下 Retional rose 2003 安装及破解

    网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...

  5. 关于32位程序在Win7&64位系统中连接Microsoft Excel数据源的问题

    最近在新公司电脑上跑以前的selenium测试框架的时候,抛出了如下的错误 出现的是ODBC Driver问题:[Microsoft][ODBC Driver Manager] Data source ...

  6. Win7 64位系统上配置使用32位的Eclipse(转)

    Win7 64位系统上配置使用32位的Eclipse 博客分类: Eclipse eclipse  最近工作电脑换成了64位的win7系统,之前个人电脑上安装的jdk和Eclipse都是32位的.而新 ...

  7. XP,32/64位Win7,32/64位Win8,32/64位Win10系统 【春节版】

    本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...

  8. XP,32/64位Win7,32/64位Win10系统【电脑城版】

    本系统是10月最新完整版本的Windows10 安装版镜像,Win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为Win10 Edge浏览器中国默认主页和搜索引擎,系 ...

  9. 【春节版】年度精品 XP,32/64位Win7,32/64位Win8,32/64位Win10系统

    本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...

随机推荐

  1. Revit中绘制带坡度管道

    激活管道绘制命令出现绘制管道上下文菜单,可以根据需要设置管道坡度值,是向上坡度还是向下坡度,其中两个命令非常有用,一个是继承高程,一个是忽略坡度以连接.在Revit建模中尝尝碰到一些带有坡度的管道,比 ...

  2. 【转】Android类动态加载技术

    http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的 ...

  3. RESTful 接口规范

    原文地址:http://www.coderli.com/translate-restful-standard-resolved OneCoder最近一直在使用Restful API,最近正好看到一篇自 ...

  4. Eclipse中web项目缓存路径

    eclipse运行web项目后, 默认保存到 workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps ecli ...

  5. 转:VC解析XML文件-CMarkup的使用详解

    本篇文章是对VC解析XML文件-CMarkup的使用进行了详细的分析介绍,需要的朋友参考下 VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等. 据说tinyX ...

  6. Activemq消息类型

    Activemq消息类型JMS规范中的消息类型包括TextMessage.MapMessage.ObjectMessage.BytesMessage.和StreamMessage等五种.ActiveM ...

  7. nginx-upstream-keepalive;accept_mutex-proxy_http_version-1.1-proxy_set_header-connection

    nginx+resin+redis+mysql的架构: 有外部模拟用户请求的大量攻击:它尝试请求了80就断开:看到的现象是在跑有nginx80的主机上TCP连接数少 : ESTABLISHED少: 在 ...

  8. Hadoop 2.7.1 使用minicluster进行单元测试

    目的是要跑通这个单元测试:hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestClose.java 这个Java文件比较简单: /** * Lic ...

  9. 【转帖】驳Jan Baan关于BPM是ERP走向没落起点的说法

    驳Jan Baan关于BPM是ERP走向没落起点的说法 Jan Bean在接受畅享网访问的时候提到“BPM是ERP走向没落的一个起点”.“BPM终将取代ERP”,让笔者这样一个在ERP行业待了接近十年 ...

  10. [GraphQL] Create a GraphQL Schema

    we’ll take a look at the GraphQL Language and write out our first GraphQL Schema. We’ll use the grap ...