Windows环境设置系统托盘图标默认显示

背景

QQ、微信等IM软件通常都会在任务栏系统托盘处添加一个图标,用于提示新消息或方便将隐藏的窗口显示出来,但Windows有默认的设置,将不常用的图标隐藏到托盘仓中,即使有消息,系统托盘也不会显示出来。以后有人说我不回消息,其实是有原因的

最近有个项目团队开发的客户端程序,希望将这个系统托盘默认显示出来,我自己下来研究了一下,开发了一个程序可以实现。先看效果图,请注意看任务托盘

Win7

Windows7下可以完美支持,不用重启资源管理器。

Win10

为啥闪一下后面解释。

解决过程

听到这个需求后,大部分人应该首先会想到修改注册表,但是修改注册表在操作系统层面上需要获取管理员权限,操作体验不好,所以首先放弃了直接修改注册表的方式,在网上查找资料后,发现了这几篇帖子,实现通过API来将某个图标设置始终显示,帖子如下:

https://gist.github.com/ysc3839/25e8ed113c4e975b6781c9759ed4ee87

https://hianz.wordpress.com/2013/09/03/new-windows-tray-notification-manager-is-here/

说干就干,根据提供的C++代码,在VS下新建工程,编译了可执行程序(ShowTray.exe),经过验证在win7下没问题,但是在Win10下无效,why?然后看到。。。

有点崩溃啊。。。,win10 1709后,偷偷的修改了API,原来的方法失效了。

继续google,了解到托盘显示状态是存储在计算机\HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify下的IconStreams键值里,但是是以二进制的方式存储的,无法直接解析。

就在山穷水尽之时,又扒出了两个帖子,可以修改注册表来修改系统托盘,但是一个是powershell脚本,一个是C#实现的。

https://stackoverflow.com/questions/7877435/set-tray-icon-to-always-show

https://github.com/lestert2005/SystemTrayModder/blob/b1061f3758f8ff9c43d77157c7a62c7e5cc6885d/source/Program.cs

看了一下具体实现,觉得移植到C++有点困难(C++学得太渣),就还是基于C#的版本改造了一下,打成了一个C#的exe(Win10ShowTray.exe)。改完注册表,需要重启一下资源管理器,所以要闪一下

ok,同时修改ShowTray,大功搞成了。整体工程如下:

依赖关系为:

ShowTray.exe为程序入口,启动时判断操作系统,如果是win7则按原来的方式运行,如果是win10则启动Win10ShowTray.exe。

使用方法

程序启动有两个参数:

ShowTray.exe (应用程序exe名称) [应用程序exe名称编码字符]

•参数1 : 应用程序exe名称,必填,拖托盘程序名称。•参数2 : 应用程序exe名称,非必填,拖托盘程序名称对应注册表中的编码,如果程序名称不包括中文则不传。参考特殊情况部分

特殊情况

当出现托盘程序为中文的情况时,win10环境会出现问题,原因是文件名成编码和在注册表中找不到,我自己测试了各种编码方式,都无法和注册表中的字符匹配,所以找了一个折中的方案,将编码好后的文件名称传入程序,即第二个参数。

这个参数的获取方式如下。

•先删除\HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify下的IconStreams键值,并重启资源管理器。

•将exe文件复制一个,文件名前后加若干个- ,例如-----XXX-----.exe,并执行后执行。

•执行regedit打开注册表,找到IconStreams键值,双击打开,在右侧的文本区域查找-----的字符,如下图,到这里,已经完成了90%了,可以看到-字符为2d00,找到2d00中间的字符,如下图的7353e5772d007a66fd80a9524b62

.exe的固定编码为2e0072006b007200,到此,可以得到编码后的名称为7353e5772d007a66fd80a9524b622e0072006b007200,这个值就是第二个参数。

PS

可能会出现360拦截的情况,这个可以参考[自己生成的EXE文件,总是被360拦截怎么办?https://bbs.360.cn/thread-15256171-1-1.html]可能不奏效。大家如果有更好的方式,欢迎交流。

作者介绍

贾乐:北京华宇信息成都研发中心架构师,已婚,勿念。

vb隐藏指定程序系统托盘图标_Windows环境设置系统托盘图标默认显示相关推荐

  1. video 设置 poster,默认显示视频第一帧

    video 设置 poster,默认显示视频第一帧 <video:src="videoUrl":poster="videoUrl + '?x-oss-process ...

  2. Dev++ 环境设置C语言关键字显示颜色

    Dev++ 环境下设置C语言关键字显示颜色或高亮显示 在默认的状态下,c语言关键字的颜色是黑色的,在写程序时不好区分关键字和变量,所以设置一下颜色会好看点. 1.点击工具->编辑器选项 2.选择 ...

  3. PL/SQL如何设置 窗口列表默认显示

    每次使用PL/SQL的时候总是要去打开Window List,十分麻烦,今天在网上找到了解决方法,如下 在工具中调出窗口列表后,再点击窗口-保存版面(S) 

  4. C语言的下载和环境设置

    C语言的下载和环境设置 系统为Windows,在在 Windows 上安装 GCC,您需要安装 MinGW.为了安装 MinGW,请访问 MinGW 的主页 www.mingw.org,进入 MinG ...

  5. python为源文件指定系统默认_Python 设置系统默认编码

    python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: 'ascii' codec can't deco ...

  6. 打印技术之获取及设置系统默认打印机

    http://www.cnblogs.com/menlsh/p/4189126.html 本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用En ...

  7. 【打印技术01】获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: 1 ...

  8. 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: 1 ...

  9. 5.6 date:显示与设置系统时间

    date命令 用于显示当前的系统时间或设置系统时间. date [选项] +[日期格式] date命令的参数选项及说明 OPTION参数选项-d 时间字符串 显示指定字符串所描述的时间,而非当前时间 ...

最新文章

  1. sklearn.naive_bayes
  2. 子div在父div中置底
  3. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
  4. mysql中 视图的优缺点_SQL中使用视图的优点和缺点是什么
  5. 计算机表情识别技术研究学什么,表情识别的图像预处理和特征提取方法研究
  6. mysql 导出表数据表结构
  7. 轻松三步教你配置oracle,Oracle Net Configuration Assistant 配置步骤简明教程
  8. LINUX C#安装开发工具MonoDevelop
  9. java gb28181网关_视频网关GB28181协议转换解决方案
  10. Win11桌面便签小工具下载 支持与手机同步的桌面便签工具下载
  11. 怎样解题 --解题表(how to solve it)
  12. 计算机exsl表f4代表锁定,Excel中F4技巧,相对引用、绝对引用和混合引用
  13. 一切归零,一切从这里开始
  14. ChatGPT修bug横扫全场,准确率达78%!程序员喜忧参半
  15. printf 输出多行字符串
  16. 二极管分类、符号、型号及作用
  17. 浅谈语音信号处理系列之二 语音信号处理的基础
  18. 点击编辑框全选内容java,js实现鼠标点击文本框自动选中内容的方法
  19. IDEA Git操作(三)使用 cherry-pick、交互式 rebase 自由修改提交树
  20. 养猫日记-20200430

热门文章

  1. php 数组去重且不保留,php数组去重并计数求和如何操作
  2. RTT的IPC机制篇——IPC通信总结
  3. CCF201612-2 工资计算
  4. 江西师范大学2017年C语言考试,2018年江西师范大学程序设计(C语言)考研初试大纲...
  5. MySQL INSERT的4种形态
  6. 聊聊数仓中TPCD-DSTPC-H与查询性能的那些事儿
  7. 开发者说:愿为你点亮“懂环境知冷暖”智能的灯
  8. 史上规模最大的中文知识图谱以及估值两个亿的 AI 核心代码
  9. 深度学习在其他领域的应用1:密码破解
  10. 带着canvas去流浪系列之九 粒子动画