如何把程序最小化到托盘图标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把程序最小化到托盘图标相关的知识,希望对你有一定的参考价值。

参数及返回值说明:
dwMessage:[输入参数] 说明要执行的动作。动作的可选值如下:
NIM_ADD 增加一个图标到托盘区
NIM_DELETE 从托盘区删除一个图标
NIM_MODIFY 修改图标
NIM_SETFOCUS 将焦点(Focus)返回托盘区。这个消息通常在托盘区图标完成了用户界面下的操作后发出。比如一个托盘图标显示了一个快捷菜单,然后用户按下ESC键了操作,这时使用NIM_SETFOCUS将焦点继续保留在托盘区。该项仅在系统外壳与常用控制DLL( Shlwapi.dll与Comctl32.dll)5.0以上版本才可用。
NIM_SETVERSION 指定使用特定版本的系统外壳与常用控制DLL。缺省值为0,表示使用Win95方式。该项仅在系统外壳与常用控制DLL 5.0以上版本才可用。
lpdata:[输入参数] 一个指向NOTIFYICONDATA结构的指针。
返回值:成功时函数返回TRUE,否则FALSE。

NOTIFYICONDATA 结构的说明(最新版)如下:
typedef struct _NOTIFYICONDATA
DWORD cbSize;
HWND hWnd;
UINT uID;
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;
NOTIFYICONDATA, *PNOTIFYICONDATA;
cbSize 以字节计的结构大小,以适应不同版本。
hWnd 接收Windows消息的窗口句柄。
uID 托盘图标的ID。
uFlags 指示结构中的哪些成员包含有效数据,可选值:NIF_ICON, NIF_MESSAGE,NIF_TIP,NIF_STATE,NIF_INFO,NIF_GUID。
uCallbackMessage 回调消息ID,由用户自定义。与一个自定义的消息处理函数关联。
hIcon 托盘图标的句柄。
szTip 托盘图标的提示字符串。
注意:以下数据成员仅限系统外壳与常用控制DLL 5.0及以上版本才有效!
dwState 图标的状态:NIS_HIDDEN-隐藏,或NIS_SHAREDICON-可视。
dwStateMask 图标状态掩码,用以设置dwState
szInfo 气球型提示(Balloon ToolTip)的字符串。
uTimeout 以毫秒计的提示显示时间
uVersion 确定所依赖的版本。0-Win95,NOTIFYICON_VERSION-Win2000
szInfoTitle 气球型提示的标题
dwInfoFlags 设置气球型提示所用的图标(类似MessageBox中所使用的图标):

NIIF_ERROR   错误
NIIF_INFO    信息
NIIF_NONE    没有图标
NIIF_WARNING  警告
NIIF_ICON_MASK 6.0版本保留
NIIF_NOSOUND  限6.0版本,不播放对应的声音
参考技术A 你先看看程序的设置里能比能设置到最小托盘,如果不能的话下载一个名为“Actual
Window
Minimizer”的小程序,它就可以将任意程序的图标缩小到系统托盘区中以节约任务栏空间。

MFC添加图标到托盘

MFC窗口实现最小化到托盘 右键菜单和还原

//.h文件
void toTray();//最小化到托盘
void DeleteTray();//删除托盘图标

afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;//图标恢复

//.cpp文件

define WM_SHOWTASK (WM_USER +1)

define IDR_SHOW 11

define IDR_OTHER 12

define IDR_EXIT 13

BEGIN_MESSAGE_MAP()
...
ON_MESSAGE(WM_SHOWTASK,OnShowTask)//消息映射
END_MESSAGE_MAP()

void ScheduleDlg::toTray()//最小化到托盘
{
??? 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_SHOWTASK;//自定义的消息名称?
??? nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));?
??? strcpy(nid.szTip,"OA");//信息提示条为“OA”?
??? Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标?
??? ShowWindow(SW_HIDE);//隐藏主窗口
}

LRESULT ScheduleDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
??? if(wParam != IDR_MAINFRAME) return 1;
??? switch (lParam)
??? {
??? case WM_LBUTTONUP://左键单击显示主界面
??????? {
??????????? this->ShowWindow(SW_SHOW);
??????????? SetForegroundWindow();
??????????? DeleteTray();
??????? }break;
??? case WM_RBUTTONUP://右击弹出菜单
??????? {
??????????? LPPOINT lpoint = new tagPOINT;
??????????? ::GetCursorPos(lpoint);//得到鼠标位置
??????????? CMenu menu;
??????????? menu.CreatePopupMenu();
??????????? menu.AppendMenu(MFT_STRING, IDR_SHOW, "打开主界面");
??????????? menu.AppendMenu(MFT_STRING, IDR_OTHER, "其他");
??????????? menu.AppendMenu(MFT_STRING, IDR_EXIT, "退出");
??????????? SetForegroundWindow();
??????????? EnableMenuItem(menu,IDR_OTHER,MF_GRAYED);//"其他"菜单变灰
??????????? //menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x,lpoint->y,this);//显示菜单
??????????? int xx=TrackPopupMenu(menu,TPM_RETURNCMD,lpoint->x,lpoint->y,NULL,this->m_hWnd,NULL);//显示菜单并获取选项ID
??????????? if(xx==IDR_SHOW)
??????????? {
??????????????? this->ShowWindow(SW_SHOW);
??????????????? SetForegroundWindow();
??????????????? DeleteTray();
??????????? }
??????????? else if(xx==IDR_OTHER) {MessageBox("你点击了“其他”菜单","提示",MB_OK);}
??????????? else if(xx==IDR_EXIT) {OnBnClickedCancel();}
??????????? HMENU hmenu = menu.Detach();
??????????? menu.DestroyMenu();
??????????? delete lpoint;
??????? }break;
??? case WM_LBUTTONDBLCLK:
??????? {
??????????? //双击不处理
??????? }break;
??? }
??? return 0;
}

void ScheduleDlg::DeleteTray()//销毁托盘图标
{
??? 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_SHOWTASK;
??? nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
??? strcpy(nid.szTip,"OA");
??? Shell_NotifyIcon(NIM_DELETE, &nid);
}

以上是关于如何把程序最小化到托盘图标的主要内容,如果未能解决你的问题,请参考以下文章

怎么设置程序启动后最小化到托盘?

请问怎样使程序在最小化后图标放在任务栏的托盘上?

如何将delphi程序图标放入系统托盘中?

win10最小化到托盘游戏掉线

只有托盘图标的 WPF 应用程序

delphi 托盘图标 主窗体就隐藏,跳出一个窗体就缩小的