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

  • 1.现成的exe(在上面的链接里
  • 2.C/C++代码
  • 3.开机登陆后延时10S执行

强迫症笔者近来看到托盘里有几个程序,日常会使用到但是不会对其托盘图标进行操作,所以想把它们隐藏(保留程序功能),就查阅了一些资料,在此分享一下
注:代码从各个地方搜刮来debug得到,在64位系统上运行成功,32位应该不行)。

github: https://github.com/LCiZY/-HideTrayIcon

1.现成的exe(在上面的链接里

cmd下调用方式:
hideTrayIcon.exe [前置时间] [托盘tooltip含有的部分文字] […]
如:hideTrayIcon.exe 5 Text1 Text2
(表示启动程序延时5S,且如果托盘的提示文字中含有Text1Text2字样,就隐藏此托盘图标,还可以有Text3 Text4等…)

2.C/C++代码
#include <atlbase.h>
#include <atlconv.h>
#include <CommCtrl.h>
#include <Windows.h>
#include <iostream>
#include <cstringt.h>
#include <string>
#include <atlstr.h>
#include <vector>#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )std::vector<char*> tip_parts;bool contain( char *s, char *p);
int parseInt(char* s);
HWND FindTrayWindow();
HWND FindOverflowTrayWindow();
VOID DeleteTrayIcon(HWND hWnd);int main(int argc, char* argv[]) {std::cout << "参数个数:"<<argc;if (argc == 1 || argc == 2) return -1;//启动延时int pre_time = -1;pre_time = parseInt(argv[1]); if (pre_time == -1) { std::cout << "参数错误 ";  return -1; } std::cout << "延时 " << pre_time << "秒 "; Sleep(pre_time * 1000); //从启动参数中得到要处理的托盘含有的部分tooltip文字for (int i = 2; i < argc; i++) { tip_parts.push_back(argv[i]); }DeleteTrayIcon(FindOverflowTrayWindow());//system("pause");return 0;
}struct TBBUTTON_1
{int iBitmap;int idCommand;byte fsState;byte fsStyle;//      [ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 ) ]//      public byte[] bReserved;byte bReserved1;byte bReserved2;// public UInt32 dwData;long long dwData;int* iString;
};//任务栏上的托盘图标
HWND FindTrayWindow()
{HWND hWnd = NULL;HWND hWndPage = NULL;  // 查找Shell_TrayWnd窗口hWnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);if (hWnd != NULL) {    // 查找TrayNotifyWnd窗口hWnd = ::FindWindowEx(hWnd, NULL, _T("TrayNotifyWnd"), NULL);if (hWnd != NULL) {      // 查找SysPager窗口.hWndPage = ::FindWindowEx(hWnd, NULL, _T("SysPager"), NULL);if (hWndPage != NULL)        // 查找ToobarWindow32窗口.hWnd = ::FindWindowEx(hWndPage, NULL, _T("ToolbarWindow32"), NULL);else// Win2000没有SysPager窗口,可直接查找ToobarWindow32窗口.hWnd = ::FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);}}return hWnd;
}//点击“显示隐藏的图标”后出现的托盘小窗体里的托盘图标
HWND FindOverflowTrayWindow()
{HWND hWnd = NULL;  // 查找NotifyIconOverflowWindow窗口hWnd = ::FindWindow(_T("NotifyIconOverflowWindow"), NULL);if (hWnd != NULL)    // 查找ToobarWindow32窗口hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);return hWnd;
}VOID DeleteTrayIcon(HWND hWnd)
{if (hWnd == NULL)return;struct TRAYDATA{HWND hWnd;UINT uID;UINT uCallbackMessage;DWORD Reserved1[2];HICON hIcon;DWORD Reserved2[3];TCHAR szExePath[MAX_PATH];TCHAR szTip[128];};DWORD dwProcessID = 0;DWORD dwButtonCount = 0;HANDLE hProcess = INVALID_HANDLE_VALUE;TBBUTTON_1 tbButton;LPVOID pTB;TRAYDATA td;NOTIFYICONDATA nid;TCHAR szSynTPEnhPath[MAX_PATH] = { 0 };TCHAR *pszApplicationName;// 查询指定窗口所含图标数,每个图标对应一个按钮dwButtonCount = (DWORD)::SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);std::cout <<"所含图标数:"<< dwButtonCount<<"\n";if (dwButtonCount == 0)return;// 获取窗口所在的线程if ((::GetWindowThreadProcessId(hWnd, &dwProcessID) != 0)&& (dwProcessID != 0)) {hProcess = ::OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,FALSE, dwProcessID);if (hProcess != NULL) {pTB = ::VirtualAllocEx(hProcess, NULL, sizeof(TBBUTTON_1), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (pTB != NULL) {// 遍历所有图标并匹配目标信息,从而找到目标图标并删除之 std::cout << "开始遍历所有图标\n";for (DWORD i = 0; i < dwButtonCount; i++) {std::cout << "[图标" << i+1 << "]  : ";bool flag1 = (SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)pTB) == TRUE);bool flag2 = (::ReadProcessMemory(hProcess, pTB, &tbButton, sizeof(TBBUTTON_1), NULL) != 0);std::cout << tbButton.iBitmap << " " << tbButton.idCommand << " " << tbButton.fsState << " " << tbButton.fsStyle << " " << tbButton.bReserved1 << " " << tbButton.dwData << " " << tbButton.iString << " ***";bool flag3 = (::ReadProcessMemory(hProcess, LPVOID(tbButton.dwData), &td, sizeof(TRAYDATA), NULL) != 0);std::cout <<"ERROR:"<< GetLastError();std::cout << "  uid:" << td.uID << "  hwnd:" << td.hWnd << " hIcon:" << td.hIcon;if (flag1&&flag2 && flag3) {TCHAR szTips[1024];::ReadProcessMemory(hProcess, (LPVOID)tbButton.iString, szTips, 1024, NULL);//szTips是Unicode字符串,需要转换USES_CONVERSION;CString csTips = W2A((WCHAR*)(szTips));std::string tip = csTips.GetBuffer(0);std::cout <<"tip:"<< tip<<" "; bool existFlag = false;for (int i = 0; i < tip_parts.size(); i++){if (contain(const_cast<char*>(tip.c_str()), tip_parts.at(i)))  { existFlag = true; break; }}// 如果托盘图标的szTip包含特定的信息,该图标就是我们准备清除的图标,找到并删除它std::cout << "ifExist:" << existFlag<<" ";if(existFlag){nid.cbSize = NOTIFYICONDATA_V2_SIZE;nid.uID = td.uID;nid.hWnd = td.hWnd;nid.hIcon = td.hIcon;nid.uCallbackMessage = td.uCallbackMessage;nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;::Shell_NotifyIcon(NIM_DELETE, &nid);::SendMessage(hWnd, TB_HIDEBUTTON, tbButton.idCommand, MAKELONG(true, 0));std::cout << "隐藏托盘图标:执行成功";}}std::cout <<" flags:"<< flag1 << " " << flag2 << " " << flag3;std::cout << std::endl;}::VirtualFreeEx(hProcess, pTB, sizeof(TBBUTTON_1), MEM_FREE);}::CloseHandle(hProcess);}}
}bool contain(char *s, char *p) {int len1 = strlen(s);int len2 = strlen(p);if (len1 < len2) return false;int index1 = 0;int index2 = 0;while (index1!=len1 && index2!=len2){if (s[index1] == p[index2]) {index1++; index2++;if (index2 == len2) return true;}else{index1++;index2 = 0;}}return false;
}int parseInt(char* s) {std::cout << " int:" << s;int len = strlen(s);int result = 0;for (int i = 0; i < len; i++){if(s[i]>=48&&s[i]<=57) result += ( (s[i]-48 ) * pow(10, len - i - 1));else return -1;}return result;}
3.开机登陆后延时10S执行

(1)在hideTrayIcon.exe所在目录创建一个vbs文件,输入以下内容

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c hideTrayIcon.exe 10 文本", vbhide

其中,参数“10”是10秒;参数“文本”是要隐藏的托盘图标上含有的部分或全部ToolTip提示文本,如火绒的我们可以将 “文本” 替换为 “火绒安全” 或 “版本号”

(2)将vbs文件的快捷方式放在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup目录下

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

  1. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  2. 64位windows10安装Sql server 2000

    64位windows10安装Sql server 2000   安装步骤:  1.用Sql 2000 sp4中文件夹x86-other中的sqlredis.exe替换sql 2000 安装目录下x86 ...

  3. 使用VC6将32位程序编译成为64位程序(这个才是可行的)

    山上明月 使用VC6将32位程序编译成为64位程序 看了好多好多资料,自己也太过依赖现有的资料,按部就班不是真理不是真理!!! 主要内容是参照http://www.vckbase.com/docume ...

  4. win7记事本如何转换html,win7记事本程序在哪里 64位win7记事本程序怎么安装

    WINDOWS 7下的记事本程序目录位置? 如何建立在Windows启动时能自动运行的记事本程序的 把那个记事本文件拖到C:\Documents and Settings\All Users\「开始」 ...

  5. MACbook安装双系统,启动转换助理提示“需要64位windows10或更高版本的ISO文件”

    MACbook安装双系统,启动转换助理提示"需要64位windows10或更高版本的ISO文件" 1,MACbook为2018年后15.6寸 2,使用了2019年windows会出 ...

  6. 将程序移植到64位Windows

    作者:Goooder 简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出了一个简单而系统的介绍.包括对于64位操作系统的版本,编程模型,一些移植原则甚至包括对 ...

  7. [百度空间] [转]将程序移植到64位Windows

    from : http://goooder.bokee.com/2000373.html (雷立辉 整理) 简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出 ...

  8. powershell 调用API显示或隐藏指定程序的主窗口

    powershell 调用API显示或隐藏指定程序的主窗口 001. 前言 一同事碰上这种情况:某个单实例的程序不知为何挂在后台运行,托盘中也找不到图标(一般是有的),但可以在任务管理器中看到该程序处 ...

  9. 梁斌penny_Penny Pinching在云端:您的Web应用程序不需要64位

    梁斌penny Often times I hear folks say that they need (or want) 64-bit support when they deploy to the ...

最新文章

  1. Linux那些事儿 之 戏说USB(9)面纱
  2. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)
  3. 频繁分配释放内存导致的性能问题的分析--brk和mmap的实现
  4. sharepoint 2013 使用outlook 打开sharepoint 任务失败
  5. Lintcode 1230解题思路和c++代码
  6. ue4加载本地版本_UE4中的本地化文本Localization Dashboard(多语言版本匹配)
  7. IntelliJ IDEA 2019 安装lombok
  8. 经典sql语句50题_SQL面试经典50题:带你从建表开始
  9. 清理操作系统垃圾批处理文件
  10. 初识ADT--抽象数据类型
  11. python2中urllib.unquote乱码的原因与解决方法
  12. k8s节点NotReady问题定位
  13. 大一上学期Python学习心得体会
  14. https://是什么?HTTPS和HTTP有什么不一样?如何申请SSL(HTTPS)证书?
  15. c语言rgb数值颜色渐变算法,颜色渐变算法
  16. Python基础进阶
  17. tomcat乱码解决方案 tomcat 乱码
  18. html5图片2d转换器,webp2jpg - 图片格式转换工具
  19. python 上传图片到七牛云上
  20. 福州大学计算机学硕分数,2021年福州大学考研录取分数线应该在哪里查询?

热门文章

  1. 游戏中物品掉落概率问题
  2. AI绘画设计师专用单词表;游戏业AI正在疯抢工作;使用AI工具翻译整本英文书;用GPT-4搞定调研报告 | ShowMeAI日报
  3. 巨杉分布式数据库在民生银行的使用
  4. cookies设置(cookies设置怎么打开)
  5. 设置Cookie/使用Cookie
  6. 怎样在文章末尾添加尾注(将尾注的数字变为方括号加数字)
  7. oracle 读取ldap数据库,Oracle PL/SQL管理LDAP服务器(DBMS_LDAP包的使用)
  8. 计算机文化的演讲稿,计算机文化演讲稿.ppt
  9. MySQL隔离性实现原理
  10. mysql常见的跳过密码登录方式