手机上的APP , 像QQ和微信等都可以在图标上动态显示消息数(最大99) , 那么你有没有想过这些效果是如何实现的?桌面上开发的传统应用程序能否也实现类似的功能?

1 思路

  • 桌面快捷方式的图标本质上就是基于一个图片产生的 , 第一种是动态生成图标(不过感觉比较费事且也消耗资源) , 建议方式是预先定义从0到99这100个图标(0就是不显示消息数 , >=99的就用99代替);
  • 获取用户的未处理消息数(根据业务情况产生 , 这里不是重点 , 直接用一个数值模拟即可);
  • 先判断该App桌面图标是否存在,存在先删除,然后根据消息数,到程序指定目录下搜寻对应编号的图标文件 , 赋值到创建桌面图标的方法中即可.

2 图片资源制作

   可以找一个透明背景的png图(如果有美工可以进行自行设计 , 我这里用的Twitter的图标) , 然后用Snagit Editor软件打开 , 在图的右上角添加一个数值标注 , 然后另存为ICO格式.如下图所示:

3 项目结构

新建一个C#桌面项目 , 然后创建一个icons文件夹来存放不同编码的图标(演示没必要创建所有 , 有2 到3个作为演示即可) , 值得注意的是 , 一定不要忘了在图标上单击 , 然后在其属性面板中设置将赋值到输出目录 , 否则找不到该图标.

  另外就是要引入一个COM库Windows Script Host Object Model , 来帮助我们创建快捷方式.

4 核心代码

  直接在默认的Form1窗体加载事件中进行动态图标创建处理 , 看代码:

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
 using IWshRuntimeLibrary;
 using System.IO;
 namespace AppWithMsgCount
 {
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
         }

         private void Form1_Load(object sender, EventArgs e)
         {
             //如何去除桌面快捷方式图标箭头
             //未测试!!!!!   cmd /k reg delete "HKEY_CLASSES_ROOT\lnkfile" /v IsShortcut /f & taskkill /f /im explorer.exe & start explorer.exe
             ShowMsgCountOnIcon();

         }
         /// <summary>
         /// 显示带消息数目的桌面快捷方式
         /// </summary>
         /// <param name="msgNum"></param>
         /// <returns></returns>
         private bool ShowMsgCountOnIcon(int msgNum)
         {
             try
             {
                 DeleteShortcut();
                // int msgNum = 99;
                 CreateShortcut(msgNum);
                 this.Text = string.Format("您有{0}个消息", msgNum);
                 return true;
             }
             catch (Exception ex)
             {
                 this.Text = string.Format("error:{0}", ex.Message);
                 return false;
             }
             finally
             {

             }
         }
         /// <summary>
         /// 如果之前有快捷方式应该先删除再刷新,否则图标不更新
         /// </summary>
         /// <param name="path"></param>
         /// <param name="iconNum"></param>
         private static void CreateShortcut(int msgNum)
         {
             // using IWshRuntimeLibrary; // > Ref > COM > Windows Script Host Object
             string link = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
                 + Path.DirectorySeparatorChar + Application.ProductName + ".lnk";
             var shell = new WshShell();
             var shortcut = shell.CreateShortcut(link) as IWshShortcut;
             shortcut.TargetPath = Application.ExecutablePath;
             shortcut.WorkingDirectory = Application.StartupPath;
             //  string appPath = AppDomain.CurrentDomain.BaseDirectory.ToString();
             string fullPath = Application.StartupPath + @"\icons\";

             shortcut.IconLocation = string.Format("{0}i{1}.ico", fullPath, msgNum.ToString());
             //shortcut...
             shortcut.Save();

         }
         /// <summary>
         /// 删除已有的APP快捷方式
         /// </summary>
         private void DeleteShortcut()
         {
             var desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
             var app = Application.ProductName + ".lnk";
             if(System.IO.File.Exists(Path.Combine(desktop, app)))
             {
                 System.IO.File.Delete(Path.Combine(desktop, app));
             }
         }
     }
 }

5 效果

  为了演示的效果更好 , 对上面的代码稍作修改 , 让他可以在命令行接受参数 , 动态传入消息数.

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Windows.Forms;

 namespace AppWithMsgCount
 {
     static class Program
     {
         /// <summary>
         /// 应用程序的主入口点。
         /// </summary>
         [STAThread]
         static void Main(String[] args)
         {
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
             if (args == null)
             {
                 Application.Run("));
             }
             else {
                 )
                 {
                     Application.Run("));
                 }
                 else
                 {
                     Application.Run(]));
                 }
         }
         }
     }
 }

如何实现桌面App图标可以动态显示消息数(类似手机上的QQ图标)?的更多相关文章

  1. Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

    http://www.51itong.net/android-badgenumber-9789.html Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒 ...

  2. swift 如何在IOS应用图标上添加消息数

    在应用图标右上角添加消息数提醒,可以很方便的告知用户该应用中有无新消息需要处理.下面用xcode 7.3.1来简要说明一下如何用swift语言进行此功能的实现. 1.修改 AppDelegate.sw ...

  3. C# 如何实现带消息数的App图标

    上次写了一篇博文,但是每次更新图标时,桌面会闪烁(刷新),有博友说人家的图标都不会刷新,还能动画.我想了一下,如果要达到这个效果,可以用Form来实现,就是在Form中嵌入一个图片,然后用一个labe ...

  4. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率 ...

  5. 一个效果很华丽的仿桌面APP,却胜似Launcher

    开发Android APP的同学是否对于Launcher实现的绚丽效果而痴迷呢?什么,连Android Launcher是什么都不知道.好吧,拿起侬的手机,在解锁后的首页界面上左右滑动滑动,体验体验, ...

  6. 在Windows Server 2012中如何快速开关桌面上经典的“计算机、我的文档”等通用图标

    我们都知道,在Windows Server 2012系列的服务器版本中都已经引入了Modern的现代界面作为默认的用户交互界面,同时满足视觉一致化,新版的服务器管理程序也做成了扁平化.因此传统的计算机 ...

  7. Android课程---如何用网格视图做出手机桌面APP

    activity_test.xml <?xml version="1.0" encoding="utf-8"?> <GridView xmln ...

  8. 使APP消除上方手机消息提示栏(显示WIFI,信号格那栏)消失的方法

    public void toggleFullscreen(boolean fullScreen) { // fullScreen为true时全屏,否则相反 WindowManager.LayoutPa ...

  9. iOS开发——应用图标上显示消息数量

    iOS8以前: UIApplication *app = [UIApplication sharedApplication]; app.applicationIconBadgeNumber = num ...

随机推荐

  1. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  2. 编写一个简单的jdbc例子程序

    package it.cast.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...

  3. javascript 中的 let 作用域

    let 声明了一个块级域的局部变量,并且可以给它一个初始化值. 语法EDIT let var1 [= value1] [, var2 [= value2]] [, ..., varN [= value ...

  4. Git Windows客户端保存用户名与密码

    1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行”中打开%Home%,新建一个名为“_netrc”的文件. 3. 用记事本打开_n ...

  5. C# MVC ( 将控制器的实体类注册到视图 )

    (1)控制器  代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; usin ...

  6. JSP知识

    五.JSP概述及最佳实践1.更改MyEclipse生成的JSP模板.模板文件与Servlet.java(Servlet模板文件)很近.2.学好JSP的关键:JSP就是Servlet.一定要记住JSP中 ...

  7. express 框架之session

    一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...

  8. 8.springMVC中的RESTful架构风格

    RESTful架构:是一种设计的风格,并不是标准,只是提供了一组设计原则和约束条件,也是目前比较流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. 关于 ...

  9. JAVA输入一个整数,求出其所有质因数

    首先得求出能整除A的数,再判断I是否是质数!!! import java.util.*; public class aa { public static void main(String[] args ...

  10. 状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely

    题目传送门 题意:有n*m的房间,'.'表示可以被点亮,'#'表示不能被点亮,每点亮一个房间会使旁边的房间也点亮,有意盏特别的灯可以选择周围不同方向的房间点亮.问最少需要多少灯使得所有房间点亮 分析: ...