2024年4月2日发(作者:)

利用Visual C++实现系统托盘程序

这些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,

用户可以通过鼠标与应用程序交互,程序开发人员有时也需要编制一些仅在后台运行的类似

程序,为了不干扰前台程序的运行界面和不显示不必要的窗口,应使程序运行时的主窗口不

可见。同时将一个图标显示在任务栏右端静态通告区中并响应用户的鼠标动作。本实例就介

绍Visual C++开发这类程序的设计方法,该程序编译运行后,如果双击托盘图标,程序会

弹出一个消息列表窗口,只要鼠标在托盘图标上移动或点击(无论是左右键的单击或双击),

产生的消息都会显示在这个窗口里;当鼠标光标移到托盘图标上时,在图标附近会显示提示

信息;单击右键时弹出上下文菜单,这个菜单中应包含打开属性页的命令或者打开与图标相

关的其它窗口的命令,另外,该程序还可以动态的改变托盘的图标。参照这个例子,相信读

者能轻松自如地在自己的程序中应用系统托盘。

一、实现方法

为了实现拖盘程序,首先要使程序的主窗口不可见,这点实现起来十分容易,只要调

用ShowWindow(SW_HIDE)就可以了,本实例采用的就是这种方法,还有一种思路是通过

分别设置主边框窗口的风格和扩展风格来隐藏主框架:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

=WS_POPUP;//使主窗口不可见;

yle =WS_EX_TOOLWINDOW;//不显示任务按钮;

return CFrameWnd::PreCreateWindow(cs);

}

在任务条上显示图标是利用系统API函数Shell_NotifyIcon()来将一个图标显示在任

务栏的通告区中。该函数的原型为:

BOOL Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);

该函数的第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下

面的值之一:

NIM_ADD: 添加一个图标到任务栏。

NIM_MODIFY: 修改状态栏区域的图标。

NIM_DELETE: 删除状态栏区域的图标。

NIM_SETFOCUS: 将焦点返回到任务栏通知区域。当完成用户界面操作时,任务栏

图标必须用此消息。例如,如果任务栏图标正显示上下文菜单,但用户按下"ESCAPE"键取

消操作,这时就必须用此消息将焦点返回到任务栏通知区域。

NIM_SETVERSION:指示任务栏按照相应的动态库版本工作。

第二个参数pnid是NOTIFYICONDATA结构的地址,其内容视dwMessage的值而定。

这个结构在SHELLAPI.H文件中定义如下:

typedef struct _NOTIFYICONDATA {

DWORD cbSize; // 结构大小(sizeof struct),必须设置

HWND hWnd; // 发送通知消息的窗口句柄

UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)

UINT uFlags;

UINT uCallbackMessage; // 消息被发送到此窗口过程

HICON hIcon; // 任务栏图标句柄

CHAR szTip[64]; // 提示文本

} NOTIFYICONDATA;