之前的同事留下了一个程序会莫名闪退的bug,今天终于发现是托盘图标闪烁使得gdi资源耗尽导致的。

先定义

#include "shellapi.h" //托盘图标引用

NOTIFYICONDATA        m_NotifyIconData;

m_NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);//长度
m_NotifyIconData.hWnd = m_hWnd;//窗口句柄
m_NotifyIconData.hIcon = GETRESPROVIDER->LoadIcon(_T("CROWD_ICON"),16);;//加载图标进去
m_NotifyIconData.uCallbackMessage = WM_NOTIFYICON;//这个是点击图标的事件消息,我们在消息处理函数WndProc()里面写一个case WM_NOTIFYICON:去处理鼠标点击图标事件
m_NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;//图标样式 _tcscpy(m_NotifyIconData.szTip, _T("程序名"));//当鼠标移动到图标的时候显示 Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData); //设置闪烁的定时器
SetTimer(TIMMER_SPANGLED_ICON,200);

在定时器里面实现闪烁

case TIMMER_SPANGLED_ICON:
{
if( m_NotifyIconData.hIcon)
{
DestroyIcon(m_NotifyIconData.hIcon) ;
m_NotifyIconData.hIcon = NULL;
Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
}
else
{
DestroyIcon(m_NotifyIconData.hIcon) ;
m_NotifyIconData.hIcon = GETRESPROVIDER->LoadIcon(_T("CROWD_ICON"),16);;//加载图标进去
Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
}
}
break;

这里要注意DestroyIcon(m_NotifyIconData.hIcon) ;这一句,如果不用这一句,每次闪烁都会使得GDI资源的增加,最终耗尽GDI资源导致崩溃。GDI资源情况可在任务管理器—>详细信息  中看到。

最后删除

DestroyIcon(m_NotifyIconData.hIcon) ;
Shell_NotifyIcon(NIM_DELETE,&m_NotifyIconData);

Shell_NotifyIcon托盘图标闪烁的更多相关文章

  1. C# 托盘图标闪烁

    在用户正在登录QQ或者使用Firemail邮件系统自动收取邮件的时候,托盘图标会闪动提示用户正在运行的任务.闪动图标可以使用定时切换托盘图标的方式实现,托盘图标可以从ImageList控件中获取.在I ...

  2. VC++实现在系统托盘来新消息闪烁,鼠标悬停显示窗口

    转载:http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c8115/How-to-Implement-a-Mouse ...

  3. Qt之自定义托盘(二)

    上一篇文章讲述了自定义Qt托盘,不过不是使用QSystemTrayIcon这个类,而是我们自己完全自定义的一个类,我们只需要处理这个类的鼠标hover.鼠标左键点击.鼠标右键点击和鼠标左键双击,就可以 ...

  4. electron 的中文文档的地址 以及 窗口改变的步骤

    electron的中文文档的地址: http://www.kancloud.cn/wizardforcel/electron-doc/137791 1.如何创建窗口和改变窗口: import { Br ...

  5. electron 的窗口设置最大化 最小化

    /** * Created by Administrator on 2016/11/23. * 页面对窗口的一些操作封装,用于渲染进程 */ "use strict"; const ...

  6. 《Dotnet9》系列-开源C# WPF控件库3《HandyControl》强力推荐

    大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员.我最近开始写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用do ...

  7. electron聊天室|vue+electron-vue仿微信客户端|electron桌面聊天

    一.项目概况 基于Electron+vue+electron-vue+vuex+Nodejs+vueVideoPlayer+electron-builder等技术仿制微信电脑端界面聊天室实例,实现消息 ...

  8. 基于vue3+electron11实现QQ登录切换|自定义导航栏|托盘|打包

    上一篇有给大家分享过使用vue3和electron快速搭建项目.创建多窗口/父子modal窗口的一些方法.今天继续给大家分享一些vue3.x+electron11项目开发中的一些知识点/踩坑记录,希望 ...

  9. Vue3.0+Electron聊天室|electron跨平台仿QQ客户端|vue3.x聊天应用

    基于vue3+electron11跨端仿制QQ桌面应用实战Vue3ElectronQchat. 使用vue3+electron+vuex4+ant-design-vue+v3scroll+v3laye ...

随机推荐

  1. HDU 4585 Shaolin(map应用+二分)

    题目大意:原题链接 初始少林最开始只有一个老和尚,很多人想进少林,每个人有一个武力值,若某个人想进少林,必须先与比他早进去的并且武力值最接近他的和尚比武, 如果接近程度相同则选择武力值比他小的,按照进 ...

  2. android 如何获取当前的Activity类名

    比如友盟统计页面停留时间,咱们需要知道当前页面停留了多久. 一般我们都有一个父类Activity,用下面的方法可以获得完整的包名.类名结构 this.getLocalClassName() 输出如下: ...

  3. BestCoder #58 div1

    2015-10-08 19:14:54 总结:赛后补的一场.题目蛮有意思的. A:DFS 思路:搜一下几个环然后判断一下即可. #include <cstdio> #include < ...

  4. RPC细节

    服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...

  5. loadrunner配置多台负载机设置

    面对并发量比较大的性能需求,用单台机子进行加压由于本身硬件资源.网络资源等的限制已经不能满足该性能测试条件,这个时候就需要在场景中添加多台负载机来联机做性能测试.添加多台负载机的设置非常简单下面做一个 ...

  6. 多媒体文件格式分析 MP3文件结构及编解码流程

    多媒体文件格式分析 http://blog.csdn.net/taniya001/article/details/7962864 多媒体文件格式分析 MP3文件结构及编解码流程 http://www. ...

  7. iis原理介绍

    它是一个程序,负责对网站的内容进行管理,以及对客户的请求(就是Http请求)做出反应.当用户对一个页面提出请求时,IIS做如下反应(忽略权限):1.把对方请求的虚拟路径转换成物理路径2.根据物理路径搜 ...

  8. 20145302张薇《Java程序设计》第十六周课程总结

    20145302 <Java程序设计>第十六周课程总结 实验报告链接汇总 实验一 Java开发环境的熟悉 实验二 Java面向对象程序设计 实验三 敏捷开发与XP实践 实验四 Andoid ...

  9. uboot的配置文件在哪里

    答:位于configs目录下,里面有各种各样板子的配置文件

  10. eclipse集成tomcat修改字符集参数

    问题: 在eclipse 4.4(Luna)中集成tomcat时,直接修改原tomcat目录中的配置文件,不起作用. 有时,我们会修改字符集参数为utf-8,以解决中文乱码问题,改动之后依然乱码…… ...