最小化托盘的实现方法

在书上看到的,觉得有用,记下了。

首先,最小化托盘的基本原理是,将应用程序的主窗体隐藏,然后在托盘中绘制应用程序的图标。然后再为托盘图标添加一些事件处理。

核心函数是Shell_NotifyIcon()函数,负责向系统传递消息,添加、修改或删除托盘区的图标。原型:

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(

DWORD dwMessage,

PNOTIFYCONDATA pnid

);

其中dwMessage标示功能,有NIM_ADD/NIM_DELETE/NIM_MODIFY。

pnid是程序最小化到托盘的图标信息结构体:

typedef struct _NOTIFYCONDATA {

DOWRD cbSize;
//结构的长度

HWND hWnd;

UINT uID;
//图标ID

UINT uFlags;
//标志着其他哪些成员数据的有效性?

UINT uCallbackMessage;
//当用户单击托盘区图标时会向窗口发送消息

HICON hIcon;
//图标句柄

char szTip[64];
//鼠标移动到托盘图标上时显示的文字

} NOTIFYICONDATA, *PNOTIFYICONDATA;

相关代码:

...

NOTIFYICONDATA nid;

nid.cbSize = (DWORD) sizeof (NOTIFYICONDATA);

nid.hWnd = this->m_hWnd;

nid.uID = IDR_MAINFRAME;

nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
//这句我不理解?

nid.uCallbackMessage = WM_CALL;

nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(nid.szTip,"MyApp");

Shell_NotifyIcon(NIM_ADD,&nid);

ShowWindow(SW_HIDE); //隐藏主窗口

...

接着自定义消息WM_CALL,方法有一篇文章有讲到。这里要注意规定了回调消息wParam接收图标ID,lParam接收鼠标的行为。

另外,当程序全部关闭时,也应该删除掉托盘,代码差不多,不重复了。

时间: 2024-11-10 15:59:21

最小化托盘的实现方法的相关文章

给最小化托盘增加右键菜单

在窗体上拖一个ContextMenuStrip控件,然后 private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { this.contextMenuStrip1.Show(MousePosition.X, MousePosition.Y - this.contextMenuStrip1.Size.

Qt 程序窗口最大、最小化相关的设置方法

Qt 生成基于对话框的程序时,程序的右上角是没有最大化.和最小化按钮的.这时可以用下面的代码: setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint); setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint); 如果需要程序一运行就最大化,可以加入下面的代码: setWindowState(Qt::WindowMaximized); 如果不希望窗口大小发生变化,可以

WPF实现窗口最小化到托盘,并且实现右击菜单

原版是从网上找了一位大神的,自己只是用了一点适合自己的. 具体实现 1.首先已经确认WPF中没有实现最小化托盘的类与方法,用到了winform中的程序集 using Drawing = System.Drawing;using Forms = System.Windows.Forms; 2.XAML的后代相应事件的Demo,只是为了看起来方便~!其中也包含了在任务栏中不现实图标,只在托盘中显示.双击实现窗口的还原.没用到大神写的,自己琢磨了个,令人想不到的蛋疼的后果还没出现,也就暂时这样了. 1

C#实现WinForm捕获最小化事件的方法

一般来说,虽然Form类没有提供Minimize的事件,但还是可以通过重载Deactive来实现WinForm捕获最小化事件. 实现方法为:当Form失去焦点后,测试WindowState取得Form状态,若为Minimized既是最小化事件. 本例为最小化后隐藏窗口: 还有种方法更加直接,重载WndProc: 实现代码如下: const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const int SC_MINIMIZE =

C#Winform将软件最小化至系统托盘

最近做了一个关于软件最小化到托盘里的功能,对此做了一点小小的总结,关于如何将软件最小化托盘里,并且点击对应小图标会有许多可供选择的菜单,其实主要用的控件是就NotifyIcon控件与contextMenuStrip控件的结合使用,利用contextMenuStrip控件添加对应的菜单以及菜单对应的功能. 第一步:首先介绍一下NotifyIcon控件的属性: BalloonTipIcon -- 气泡提示的类型,有None(无).Info(蓝色感叹号).Warnning(黄色感叹号).Error(小

托盘图标_实现方法_最小化到托盘_关闭到托盘_delphi_托盘汇总

托盘图标_实现方法_最小化到托盘_关闭到托盘_delphi_托盘汇总 转自:http://midasyang.blog.163.com/blog/static/189744104201141245344681/ 启动不显示主窗体如果通过Form1.Visible:=False;语句来实现的话,会出现主窗体一闪而过的情形.更好的办法是在OnShow事件中添加Application.ShowMainForm := False; 程序不出现在任务栏procedure TForm1.FormShow(S

Outlook2007最小化至托盘

设置outlook新邮件到达提醒:Tool->Options->Prefrences->Email->Email Options->Advanced Email Options->When new items arrive in my Inbox这里面几项你根据需要设置一下就可以了. OUTLOOK启动后最小化总是在任务栏上占一个位置,工作起来碍事,所以希望它能够最小化到托盘,以下方法可以帮你实现: 打开注册表 : 开始菜单 -> 运行, 输入"rege

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

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

delphi程序最小化任务栏控件 托盘

unit MyTray; interface uses   Windows,Messages,SysUtils,Classes,Graphics,Controls, Forms,Dialogs,ShellApi,ExtCtrls,StdCtrls; const //自定义托盘消息   WM_TrayMsg=WM_USER+10; type //恢复窗口的方式,左双击,右双击,左单击,右双击   TRMode=(LDbClick,RDbClick,LCLick,RClick);   TMyTray