系统托盘

为程序添加系统托盘
1:创建菜单资源 ID: IDR_MENU_NOTIFY
2:添加子菜单

显示 IDM_NOTIFY_SHOW

退出 IDM_NOTIFY_CLOSE

3:查看MSDN Shell_NotifyIcon

BOOL Shell_NotifyIcon( //向系统托盘中加入图标
DWORD dwMessage, //状态
PNOTIFYICONDATA lpdata //含有图标 消息响应 的一个结构体);

4:认识NOTIFYICONDATA 结构体:

typedef struct _NOTIFYICONDATA {
DWORD cbSize; //结构体自身大小 这里一定要进行初始化
HWND hWnd; //托盘的父窗口 托盘发出的消息由哪一个窗口响应
UINT uID; //显示图标的ID
UINT uFlags; //托盘的状态 (如有图标,有气泡提示,有消息响应等)
UINT uCallbackMessage; //托盘事件的消息响应函数
HICON hIcon; //图标的变量
TCHAR szTip[64]; //气泡的显示文字 就是我们的鼠标停留在托盘图标上有文字显示
DWORD dwState; //图标的显示状态
DWORD dwStateMask; //图标的显示状态
TCHAR szInfo[256]; //气泡的显示文字 (可以忽略)
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;

5:定义上述结构变量为类的成员变量 并在OnInitDialog函数中进行初始化添加代码

nid.cbSize = sizeof(NOTIFYICONDATA); //大小赋值
nid.hWnd = m_hWnd; //父窗口 是被定义在父类CWnd类中
nid.uID = IDR_MAINFRAME; //icon ID
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; //托盘所拥有的状态
nid.uCallbackMessage = UM_ICONNOTIFY; //回调消息
nid.hIcon = m_hIcon; //icon 变量
CString str="Remote远程协助软件........."; //气泡提示
lstrcpyn(nid.szTip, (LPCSTR)str, sizeof(nid.szTip) / sizeof(nid.szTip[0]));
Shell_NotifyIcon(NIM_ADD, &nid); //显示托盘

6:声明自定义的回调消息:
UM_ICONNOTIFY 在Stdafx.h中添加 这里也使用枚举因为我们在工程的后期会有很多的自定义消息

如下:enum
{
UM_ICONNOTIFY=WM_USER+1
};

7:声明消息处理函数:

afx_msg void OnIconNotify(WPARAM wParam,LPARAM lParam); ---->这里很重要

8:添加消息响应:

ON_MESSAGE(UM_ICONNOTIFY, (LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))OnIconNotify)  注:vc里面不需要(LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))

9:实现消息响应函数
void CRemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
switch ((UINT)lParam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
if (!IsWindowVisible())
ShowWindow(SW_SHOW);
else
ShowWindow(SW_HIDE);
break;
case WM_RBUTTONDOWN:
CMenu menu;
menu.LoadMenu(IDR_MENU_NOTIFY);
CPoint point;
GetCursorPos(&point);
SetForegroundWindow(); //设置当前窗口
menu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x, point.y, this, NULL);
PostMessage(WM_USER, 0, 0);
break;
}
}

10:添加我们系统托盘的菜单响应函数 注意类的名称。

void CRemoteDlg::OnNotifyShow() ID_NOTIFY_SHOW
{
// TODO: 在此添加命令处理程序代码
ShowWindow(SW_SHOW);
}

11:void CRemoteDlg::OnNotifyClose() ID_NOTIFY_EXIT

{
// TODO: 在此添加命令处理程序代码
PostMessage(WM_CLOSE);
}

12:编译运行。我们发现系统的托盘图标不能迅速销毁
解决方案:
添加一个系统托盘的消息
afx_msg void OnClose();

ON_WM_CLOSE()

void CRemoteDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
Shell_NotifyIcon(NIM_DELETE, &nid);
CDialogEx::OnClose();
}

到此我们的托盘的大概设置就完毕了。

时间: 2025-01-11 16:18:05

系统托盘的相关文章

Qt实现系统托盘

        平时大多数看到的软件都是带系统托盘的,这样软件可以在后台运行,挺好的.今天看了下Qt自带的demon,中间有参考了下,实现了这个小小的功能,就将这个功能添加到了自己之前的一个项目中,效果蛮好的.界面如下所示: 右击系统托盘就会显示当前设定的各个菜单功能: 怎么样,效果还好吧.实现这个小功能厅满意的.右键点击弹出的菜单可以自行设定所需的.另外可以设定鼠标单击.双击.中间键分别按下时所触发的动作.主要代码如下所示: 1.首先需要添加头文件,Qsystem/trayIcon类.QMen

Qt系统托盘

Qt的系统托盘的使用,可比mfc中好多了!他封装了一个专门的QSystemTrayIcon类,建立系统托盘图标.其实在Qt提供的示例程序已经很不错了,$QTDIR\examples\desktop\systray在这里简单的实现一个系统托盘功能,对其系统托盘类的使用做以演示. #include <QtGui>class Window: public QWidget{    Q_OBJECT        public:    Window(); private:    void showMes

C# NotifyIcon添加系统托盘

要求: 1 程序启动时,无系统托盘 2 程序最小化时,显示托盘,且程序隐藏 3 双击系统托盘,显示主界面,托盘隐藏 4 系统托盘右键,点击显示和退出按钮,主程序显示和退出 代码; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin

WPF 系统托盘 图标闪烁

WPF消息通知 系统托盘,图标闪烁 1 using System.Windows.Forms; 2 3 using System.Windows.Threading; 4 5 public partial class Window : Window 6 { 7 private NotifyIcon notifyIcon; 8 DispatcherTimer icoTimer = new DispatcherTimer(); 9 string icoUrl = @"../../Red.ico&qu

Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)

在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789   _NOTIFYICONDATAA = record   cbSize: DWORD;   Wnd: HWND;   uID: UINT;   uFlags: UINT;   uCallbackMessage: UINT;   hIcon: HICON;   szTip: array [0..63] of Ansi

服务程序增加系统托盘

服务程序增加系统托盘 用Delphi创建服务程序作者:未知 文章来源:岁月联盟 Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:(1)不用登陆进系统即可运行.(2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.运行Delphi7,选择菜单File-->New-->Oth

Windows Phone 7编程学习点滴二——设备方向、系统主题和系统托盘

1 有两种方式可以改变设备的方向: (1) 将SupportedOrientation设置为“PortraitOrLandscape”让操作系统为你实现. (2) 是通过代码实现: OrientationChanged 事件. 1 this.OrientationChanged += new EventHandler<OrientationChangedEventArgs>(MainPage_OrientationChanged); 1 void MainPage_OrientationCha

系统托盘编程完全指南

原文:http://www.hellocpp.net/Articles/Article/574.aspx 第一部分 自从Windows 95面市以来,系统托盘应用作为一种极具吸引力的UI深受广大用户的喜爱.使用系统托盘UI的Windows应用程序数不胜数,比如"金山词 霸"."Winamp"."RealPlayer"等等.那么如何编写自己的托盘应用呢?本文是系列文章中的第一篇,这些文章将比较系统地描述托盘应用的 编程.并创建自己的C++类来增强系

java应用程序-系统托盘

本实例是用来制作应用程序的系统托盘,比如类似qq在窗体的右下角的图标格式.代码直接复制可用. 1 import java.awt.AWTException; 2 import java.awt.Image; 3 import java.awt.MenuItem; 4 import java.awt.PopupMenu; 5 import java.awt.SystemTray; 6 import java.awt.TrayIcon; 7 import java.awt.event.ActionE

将Mozilla ThunderBird最小化到系统托盘(转载)

转自:http://be-evil.org/mozilla-thunderbird-minize-to-tray.html Mozilla ThunderBird是一款非常不错的邮件客户端,但是其在默认状态下不能最小化到系统任务栏中,这个设计让我十分不爽,不过Mozilla那强悍的插 件资源完全弥补这个问题,下面介绍一款插件可以实现将Mozilla ThunderBird最小化到系统托盘: MinimizeToTray Plus Versions 1.0.8 这款插件可以将ThunderBird