关闭

MFC中使用任务栏显示图标表示程序

标签: NOTIFYICONDATAShell_NotifyIconWM_SYSCOMMAND任务栏图标气泡提示
199人阅读 评论(0) 收藏 举报
分类:

在任务栏中通过图标表示应用程序,就是当按下应用程序窗口的最小化按键时,隐藏窗口,并在任务栏中显示图标表示该应用程序;当鼠标点击了任务栏中的图标时,显示窗口,并删除任务栏中的图标。

1 在任务栏中显示图标

通过NOTIFYICONDATA结构Shell_NotifyIcon()函数实现图标的显示。

1.1 NOTIFYICONDATA结构

该结构包含了系统所需的进程任务栏状态区域消息。该结构的成员变量较多,一般需要设置的变量有cbSizehWnduIDuFlagshIconuCallbackMessageszTip等。其中,

cbSize表示NOTIFYICONDATA结构的大小;

hWnd指定了接收通知消息的窗口句柄,该通知消息与任务栏中的图标相关;

uID指定了该操作任务栏中的哪个图标;

uFlags表示NOTIFYICONDATA结构中哪些成员变量需要设置;

hIcon指定了要在任务栏中添加、删除或者修改的图标句柄;

uCallbackMessage:指定了一个自定义的消息,当在任务栏显示的图标区域内发生鼠标动作时,该消息将会被发送给hWnd指定的窗口。通过该消息的响应函数,即可实现对鼠标动作的处理。

szTip表示鼠标在任务栏图标上时显示的提示信息。

NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK;
nid.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
strncpy(nid.szTip, ("键盘屏蔽"), sizeof("键盘屏蔽"));
nid.szTip[sizeof("键盘屏蔽")] = _T('\0');
其中,IDI_ICON1是项目中图标资源的IDuFlags的值中,NIF_ICONNIF_MESSAGENIF_TIP分别表示结构的hIconuCallbackMessageszTip三个成员变量将被使用;WM_SHOWTASK是自定义消息,当在任务栏的IDI_ICON1图标范围内发生鼠标动作,则该消息将会被发送给程序主窗口。

1.2 Shell_NotifyIcon()函数

使用Shell_NotifyIcon()函数在任务栏中显示图标。该函数的作用是将消息发送给任务栏的状态区域,系统收到消息后,进行后续处理。Shell_NotifyIcon()函数的格式为

BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
其中,参数dwMessage表示向任务栏状态区域发送的消息,该消息可以是添加图标、删除图标和修改图标等消息,系统收到不同的消息进行不同的处理;lpdataNOTIFYICONDATA结构的指针,包含了任务栏图标的相关信息。如果发送消息成功,则返回值为TRUE,否则为FALSE

Shell_NotifyIcon(NIM_ADD, &nid);
其中,NIM_ADD表示向任务栏中添加图标,添加图标的相关信息保存在nid中。

2 最小化按键消息处理

当按下窗口最小化按键后,应该隐藏当前窗口,并且在任务栏中显示程序对应的图标。按下窗口最小化按键,会向系统发送WM_SYSCOMMAND消息。通过ON_WM_SYSCOMMAND宏指定该消息的响应函数,该消息的响应函数为OnSysCommand()。以上消息映射宏及消息响应函数在程序创建时已经自动创建完毕。

OnSysCommand()函数的格式为

afx_msg void OnSysCommand(
   UINT nID,
   LPARAM lParam
);
其中,参数nID表示收到的系统指令的类型;lParam表示鼠标在系统指令菜单上的坐标。在该函数中,对nID的类型进行判断,如果按下的是最小化按键,则隐藏窗口,并且在任务栏中显示程序对应的图标。

if (nID == SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
HideToTray();
}
其中,SC_MINIMIZE表示按下了最小化按键,ShowWindow()函数的作用是隐藏当前窗口,HideToTray()函数的功能是在任务栏中显示图标。

3 任务栏图标鼠标动作的响应

在前面已经提到,当鼠标点击任务栏图标后,显示程序主窗口并且在任务栏中删除图标。对于鼠标点击的响应,NOTIFYICONDATA结构的uCallbackMessage成员变量指定了发生鼠标动作时发送的消息。接下来对该消息进行响应。

3.1 声明消息响应函数

在头文件中对消息响应函数进行声明。

LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);

3.2 消息响应宏

在执行文件中使用ON_MESSAGE宏将消息与相应函数关联。

ON_MESSAGE(WM_SHOWTASK, OnShowTask)

3.3 定义消息响应函数

消息响应函数的两个参数wParamlParam分别表示鼠标动作所在任务栏图标的ID和鼠标动作对应的消息。

if (wParam != IDI_ICON1)
{
return -1;
}
switch (lParam)
{
case WM_LBUTTONUP:
ShowWindow(SW_SHOW);
HideFromTray();
break;
default:
break;
}
其中,IDI_ICON1是在NOTIFYICONDATA结构的uID成员变量的值。当鼠标点击了状态栏中图标时,显示程序主窗口。HideFromTray()函数为自定义函数,该函数的作用是从任务栏中删除程序对应的图标,该函数的定义为

NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1;
nid.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &nid);
其中,Shell_NotifyIcon()函数的第一个参数为NIM_DELETE,表示从任务栏中删除程序对应的图标。

0
0
查看评论

在基于对话框的MFC程序中,使程序在任务栏中不显示图标

在app的initinstance里的主对话框domodal之前生成一个隐藏的对话框 BOOL CTestDlgApp::InitInstance() { ... CFrameWnd a;   //生成一个框架窗口对象 a.C...
  • shenlanzifa
  • shenlanzifa
  • 2014-10-14 17:36
  • 1048

基于对话框的MFC程序中,实现非模态子窗口在任务栏显示图标以及窗口左上角加图标

在基于对话框的MFC程序中为了使子窗口同父窗口一样
  • zhuimengshizhe87
  • zhuimengshizhe87
  • 2014-11-02 10:22
  • 1326

MFC对话框程序启动的时候直接隐藏、在任务栏不显示图标

2011-06-19以前做一个项目,要求程序启动的时候主对话框是隐藏的。当时不知道怎么做,修改窗口风格、窗口类、OnInitDialog里ShowWindow、Create函数、WM_CREATE消息、PreCreateWindow等等都尝试了,没什么用,相当郁闷。后来有在网上找到一个解决方案,算是...
  • liuhua1982
  • liuhua1982
  • 2011-06-19 03:35
  • 3464

MFC 子对话框多了任务栏图标?

在编写对话框程序时,增加了个子对话框,想使用主对话框的界面直接拿来修改,于是直接复在左边的资源管视图(ResourceView)里面直接按Ctrl键拖拉复制了一个,更改对话框标题、ID,一切顺利。       但是运行的时候问题出现了!其它的子对话框弹出时任务栏上...
  • cdl123456
  • cdl123456
  • 2014-04-08 11:49
  • 368

windows/mfc实现窗口隐藏同时 在任务栏上无图标显示功能

当实现窗体隐藏时,同时让任务栏隐藏
  • u013105439
  • u013105439
  • 2016-11-22 00:50
  • 1747

vc/mfc如何使程序不显示在任务栏

在OnCreate函数中加入 if (CWnd::OnCreate(lpCreateStruct) == -1) return -1 ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);//加入这句
  • XiaoY_2012
  • XiaoY_2012
  • 2016-05-28 15:24
  • 1334

关于MFC程序中隐藏任务栏图标的问题

前几天有个MFC对话框程序,有个隐藏任务栏图标的功能需求,就在网上搜了搜,发现基本上都是这一句: ```ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);```也就是修改窗口的扩展风格,去掉APPWINDOW属性,添加TOOLWINDOW属性,这样做的效...
  • starytx
  • starytx
  • 2017-04-05 13:17
  • 433

MFC 使程序不在任务栏显示

1,目标 使程序隐藏在任务栏的简单方法。 适用与一些特殊窗口情况,比如悬浮窗、弹窗等,不需要在任务栏显示。 2,原理&实现 在OnInitDialog()中直接修改窗口风格: // 让本程序不在任务栏显示(创建一个工具条窗口) ModifyStyleEx(WS_EX_APPWI...
  • dpsying
  • dpsying
  • 2013-12-13 20:35
  • 4430

MFC中使用任务栏显示图标表示程序最小化

在任务栏中通过图标表示应用程序,就是当按下应用程序窗口的最小化按键时,隐藏窗口,并在任务栏中显示图标表示该应用程序;当鼠标点击了任务栏中的图标时,显示窗口,并删除任务栏中的图标。 1 在任务栏中显示图标 通过NOTIFYICONDATA结构和Shell_NotifyIcon()函数实现图标的显示...
  • hou09tian
  • hou09tian
  • 2017-10-09 22:40
  • 134

任务栏通知区的应用程序图标不显示时的解决办法

任务栏通知区,即windows右下脚显示应用程序图标和系统时间 的区域,有时候我们会发现,某些应用程序的图标无法显示了,解决方法如下:方法一:开机运行systray.exe,但这不能彻底解决,也不一定能使消失的图标恢复;方法二:regsvr32 %windir%/system32/stobject....
  • scz123
  • scz123
  • 2006-11-23 09:33
  • 10777
    个人资料
    • 访问:58619次
    • 积分:2340
    • 等级:
    • 排名:第18860名
    • 原创:183篇
    • 转载:0篇
    • 译文:0篇
    • 评论:6条
    最新评论