程序隐藏到任务栏的实现

我们在使用软件的时候,有的软件允许最小化到任务栏,然后双击任务栏的图标时又会显示出来,这篇文章主要说明如何实现这种功能; 实现这种功能主要分为两步,一是将程序窗口隐藏,二是将程序图标添加到任务栏,再次显示也是分为两步:第一步是将任务栏上的图标删除,第二步是将窗口显示出来。窗口的隐藏与显示我们用API函数ShowWindow,而添加和删除任务栏中的程序图标用的是Shell_NotifyIcon函数,ShowWindow函数平时用的比较多,而且也比较简单,这里就不在阐述,下面主要说明Shell_NotifyIcon的用法:

BOOL Shell_NotifyIcon(          
    DWORD dwMessage,
    PNOTIFYICONDATA lpdata
);

该函数有两个参数,第一个表示你希望对图标做何种操作主要有这几个值:NIM_ADD、NIM_DELETE、NIM_MODIFY、NIM_SETFOCUS、NIM_SETVERSION;常用的是前面3个主要是向任务栏添加图标、删除图标、修改图标; 第二个参数是一个结构体该结构体的定义如下:

typedef struct _NOTIFYICONDATA { 
  DWORD cbSize;//该结构的大小
  HWND hWnd; //表明当对任务栏图标进行操作是将消息发送给那个窗口
  UINT uID; //应用程序的ID
  UINT uFlags; //一个标志
  UINT uCallbackMessage;//对任务栏图标操作时向窗口发送的一个消息 
  HICON hIcon; //放到任务栏中的图标句柄
  WCHAR szTip[64]; //当鼠标停在图标上时显示的提示信息
} NOTIFYICONDATA, *PNOTIFYICONDATA;

UINT uID 参数是应用程序的ID,这个ID并不是必须的可以任意给值 UINT uFlags 参数是一个标志,主要用于控制图标的行为: NIF_ICON:有这个标志hIcon才是有效值 NIF_MESSAGE:有这个标志uCallbackMessage才有效,也就是说有这个标志,当我们进行操作时才有消息产生 NIF_TIP:当有这个标志时szTip,才有效,才会出现提示信息; UINT uCallbackMessage:当我们对任务栏图标进行操作时会发送一条消息这个消息由用户自己定义,并且在窗口过程中处理。

函数介绍完了,接下来就是实现的代码:

//这里是将移出图标与添加图标放到一个函数中,根据第二个参数判断是需要移出或是添加
BOOL TrackIcon(HWND hWnd, BOOL bTrak)
{
    NOTIFYICONDATA nid = {0};
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = hWnd;
    nid.uID = 0;
    if (bTrak)
    {
        nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
        nid.uCallbackMessage = WM_TRAKICON_MSG;
        nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        _tcscpy_s(nid.szTip, sizeof(nid.szTip), _T("提示信息"));

        ShowWindow(hWnd, SW_MINIMIZE);
        ShowWindow(hWnd, SW_HIDE);
        return Shell_NotifyIcon(NIM_ADD, &nid);
    }else
    {
    //当需要移出图标时,窗口也应该完全显示,因此不需要对图标操作,后面的几个值就是无效值,这里可以不用管它们
        ShowWindow(hWnd, SW_SHOWNA);
        return Shell_NotifyIcon(NIM_DELETE, &nid);
    }

}
//这是对我们自定义的消息进行处理,这个消息中的lParam保存了相应的消息ID
case WM_TRAKICON_MSG:
        {
            switch (lParam)
            {
            case WM_LBUTTONDBLCLK:
                TrackIcon(hwndDlg,FALSE);
                ShowWindow(hwndDlg,SW_SHOWNORMAL);
                break;
            }
        }
        break;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

C# WinForm 技巧八:界面开发之“WeifenLuo.WinFormsUI.Docking+OutLookBar” 使用

WeifenLuo.WinFormsUI.Docking + OutLookBar结合使用的效果图

1281
来自专栏张善友的专栏

Page.FindControl方法找不到指定控件的原因

在ASP.NET 2.0中,引入了MasterPage的机制,在当前页使用MasterPage的情况下,放在 ContentPlaceholder1这样的内容页...

2297
来自专栏林德熙的博客

WPF 使用封装的 SharpDx 控件

上一篇告诉大家如何在 WPF 使用 SharpDx ,看起来代码比较复杂,所以本文告诉大家如何使用我封装的控件。

1712
来自专栏林德熙的博客

dotnet 从入门到放弃的 500 篇文章合集

博客包括 C#、WPF、UWP、dotnet core 、git 和 VisualStudio 和一些算法,所有博客使用 docx 保存

1752
来自专栏林德熙的博客

win10 17025 触摸bug

This article is written in both English and Chinese. 本文使用中文和英文两个版本。 在 win10 的 1...

761
来自专栏我和未来有约会

从Flash到Silverlight进阶教程-用代码来创建动画

从Flash到Silverlight进阶教程 用代码来创建动画 这节里将要讲述一个自定义用户控件最基本的操作,就好象Flash中的MovieClips一样,动态...

3675
来自专栏王大锤

IOS开发中滑动页面时NSTimer停止的问题

3789
来自专栏hbbliyong

WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法

一、WPF 中获取和设置鼠标位置   方法一:WPF方法 Point p = Mouse.GetPosition(e.Source as Framewo...

3657
来自专栏BY的专栏

iOS定时器,你真的会使用吗?前言正文结语

5055
来自专栏Ken的杂谈

ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门

本篇代码基于以下代码进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapt...

1815

扫码关注云+社区