我们在使用软件的时候,有的软件允许最小化到任务栏,然后双击任务栏的图标时又会显示出来,这篇文章主要说明如何实现这种功能;
实现这种功能主要分为两步,一是将程序窗口隐藏,二是将程序图标添加到任务栏,再次显示也是分为两步:第一步是将任务栏上的图标删除,第二步是将窗口显示出来。窗口的隐藏与显示我们用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;
最后程序的运行结果如下: