c最小化托盘
- 格式:docx
- 大小:21.78 KB
- 文档页数:5
VC++制作一个最小化最小托盘的8步骤Introduction这篇文章解析了Shell_NotifyIcon这个函数用法--用来建立你自己的应用程序的系统托盘图标.这篇文章给了基本的缩小到托盘的操作过程并让你从中了解.这篇文章提供8个简单的步骤让你成功的实现在你的程序中建立系统托盘图标.源代码提供了一个基于对话框的演示程序.Tray Icons为了用托盘图标你需要用一个shell函数:)BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid );ThedwMessage可选的参数包括theNIM_ADD,NIM_DELETE and NIM_MODIFY功能分别是添加删除以及修改图标于系统图标.PNOTIFYICONDATA结构包括这些系统需要处理的任务图标状态区域消息等信息.typedef struct _NOTIFYICONDATA {DWORD cbSize;HWND hWnd;UINT uID;UINT uFlags;UINT uCallbackMessage;HICON hIcon;#if (_WIN32_IE < 0x0500)TCHAR szTip[64];#elseTCHAR szTip[128];#endif #if (_WIN32_IE >= 0x0500)DWORD dwState;DWORD dwStateMask;TCHAR szInfo[256];union {UINT uTimeout;UINT uVersion;} DUMMYUNIONNAME;TCHAR szInfoTitle[64];DWORD dwInfoFlags;#endif #if (_WIN32_IE >= 0x600)GUID guidItem;#endif} NOTIFYICONDATA, *PNOTIFYICONDATA;*Note: 更完全的信息可以去参考MSDNCreating the ApplicationCreate a new VC++ dialog based project and call it TrayMin.创建一个名叫TrayMin的基于对话框的VC++工程Step: 1自定义消息于TrayMinDlg.h 头文件.#define WM_TRAY_MESSAGE (WM_USER + 1)TheWM_USER常量用来帮助用户定义自己的消息被用来建立个人的窗口类, 定义时通常用这种格式WM_USER+X, 这里X 是一个整形变量.*更详细的看MSDNStep: 2现在在Now add the DECLARE_MESSAGE_MAP() 之前添加下面的用户函数吧(TrayMinDlg.h file)afx_msg void OnTrayNotify(WPARAM wParam, LPARAM lParam);当添加一个图标到托盘时这有一个图标的回调消息,注意到NOTIFYICONDATA结构中有uCallbackMessage成员是回调消息识别的关键,它会被传给NIM_ADD(我们之后将会见到更详细的)。
系统最小化到托盘一、托盘简介所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。
在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
二、托盘编程相关函数其实,把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。
绘制图标以及确定图标所传送消息的函数只有一个,WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid);这个函数负责向系统传递消息,以添加、修改或删除托盘区的图标。
她的返回值是个布尔类型的。
就是说,如果返回0才成功。
参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。
如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。
参数pnid就是具体的和程序在托盘区的图标有关系的结构了。
它的定义如下:typedef struct _NOTIFYICONDATA {DWORD cbSize;HWND hWnd;UINT uID;UINT uFlags;UINT uCallbackMessage;HICON hIcon;char szTip[64];} NOTIFYICONDATA, *PNOTIFYICONDATA;下面就对该结构各个参数进行刨析:cbSize : 结构的长度,用“位”来做单位。
一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。
HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。
大多数情况下是this->m_hWnd。
uID : 在工程中定义的图标IDuFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。
Delphi7使用控件CoolTrayIcon时如何做到程序启动就最小化到托盘学习Delphi时,使用了第3方控件CoolTrayIcon。
CoolTrayIcon 的功能很强大,能够将程序添加进托盘,省去了我们再编写代码来实现托盘。
但是在看搜CoolTrayIcon的时候,发现好多朋友在求如何让程序在启动就最小化多托盘的方法。
但是貌似都不曾成功过。
笔者摸索了一下,成功实现了。
找原因首先我们来看一下CoolTrayIcon的功能函数:根据CoolTrayIcon的使用实例来看,CoolTrayIcon提供了函数HideMainForm()。
好吧我们如果在FromCreat里面如果调用该函数会发现没有任何反应。
为什么呢?我们接着跟踪这个函数看一下它的声明:procedure TCoolTrayIcon.HideMainForm;beginif Owner is T WinControl then // Owner might be of type TServiceif Appl ication.MainForm <> nil thenbegin// Hide the form itself (and t hus any child windows)Application.MainForm.Visible := False;{ H ide application's TASKBAR icon (not the tray icon). Do this AFTE Rthe main form is hidden, or any child windows will redisplay th etaskbar icon if they are visible. }HideTaskbarIcon;end;end;好吧,我们看到这里应该知道了吧。
如果你还不知道,可以对它设置断点调试,你就会发现函数声明的语句根本就没有进去。
Window窗体应用中,有很多地方都会用的到,下面是我总结一个实例可以给大家分享分享,只供参考,如果有什么不对或欠缺的地方,请莫见怪.(C#)实现最小化托盘需要一个控件,叫notifyIcon,引用这个控件之后,上面的图标需要用.ico格式的,如果需要使用右键菜单,可在此控件属性中的contextMenuStrip设置,当然前提是你要有这个contextMenustrip控件.窗体页面:代码实例:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace Test_tuopan{public partial class Form1 : Form{public Form1(){InitializeComponent();}///<summary>///最小化时发生///</summary>private void NormalToMinimized(){this.WindowState = FormWindowState.Minimized; //最小化时隐藏窗体this.Visible = false; //是窗体不可见this.notifyIcon1.Visible = true; //图标在任务栏区域可见this.ShowInTaskbar = false; //是否在任务栏显示窗体 }///<summary>///点击托盘时窗体恢复正常///</summary>private void MinimizedToNormal(){this.Visible = true; //窗体可见this.WindowState = FormWindowState.Normal; //窗体状态为正常notifyIcon1.Visible = true; //托盘图标可见}private void Form1_FormClosing(object sender, FormClosingEventArgs e){if (DialogResult.Yes == MessageBox.Show("确定要关闭吗?", "提示", MessageBoxButtons.YesNo, rmation)){e.Cancel = false;}else{e.Cancel = true;}}///<summary>///窗体变化时触发的事件///</summary>///<param name="sender"></param>///<param name="e"></param>private void Form1_Resize(object sender, EventArgs e){if (this.WindowState == FormWindowState.Minimized){NormalToMinimized();}}///<summary>///点击托盘图标时,显示窗体///</summary>///<param name="sender"></param>///<param name="e"></param>private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {//点击鼠标左键if (e.Button == MouseButtons.Left){if (this.WindowState == FormWindowState.Minimized){//显示窗体MinimizedToNormal();}else{//最小化到托盘NormalToMinimized();}}}private void显示ToolStripMenuItem_Click(object sender, EventArgs e) {//显示窗体MinimizedToNormal();}private void退出ToolStripMenuItem_Click(object sender, EventArgs e) {this.Close();}}}。
MFC中将窗口最小化至系统托盘1.在对话框类中声明NOTIFYICONDATA变量class CCamProjDlg : public CDialog{...NOTIFYICONDATA nid;BOOL isNotify;...}//初始化isNotify = false;2.在resource.h文件中自定义消息#define WM_SHOWTASK 10013.在对话框类中声明消息相应函数class CCamProjDlg : public CDialog{...afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);...}4、在消息映射中添加BEGIN_MESSAGE_MAP(CCamProjDlg, CDialog)...ON_MESSAGE(WM_SHOWTASK,onShowTask)...END_MESSAGE_MAP()5.定义消息响应函数LRESULT CCamProjDlg::onShowTask( WPARAM wParam, LPARAM lParam ){ // wParam接收的是图标的ID,而lParam接收的是鼠标的行为if( wParam != IDR_MAINFRAME )return 1;switch(lParam){case WM_RBUTTONUP: // 右键起来时弹出快捷菜单,这里只有一个"关闭"{LPPOINT lpoint = new tagPOINT;::GetCursorPos(lpoint); // 得到鼠标位置CMenu menu;menu.CreatePopupMenu(); // 声明一个弹出式菜单menu.AppendMenu(MF_STRING,WM_DESTROY,_T("关闭")); // 增加菜单项"关闭",点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。
MFC 中将窗口最小化至系统托盘1. 在对话框类中声明 NOTIFYICONDATA 变量class CCamProjDlg : public CDialog{...NOTIFYICONDATA nid;BOOL isNotify;...}//初始化isNotify = false;2. 在 resource.h 文件中自定义消息#define WM_SHOWTASK 10013. 在对话框类中声明消息相应函数class CCamProjDlg : public CDialog{...afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam; ...}4、在消息映射中添加BEGIN_MESSAGE_MAP(CCamProjDlg, CDialog...ON_MESSAGE(WM_SHOWTASK,onShowTask...END_MESSAGE_MAP(5. 定义消息响应函数LRESULT CCamProjDlg::onShowTask( WPARAM wParam, LPARAM lParam { // wParam接收的是图标的 ID ,而 lParam 接收的是鼠标的行为if( wParam != IDR_MAINFRAMEreturn 1;switch(lParam{case WM_RBUTTONUP: // 右键起来时弹出快捷菜单,这里只有一个 " 关闭 " { LPPOINT lpoint = new tagPOINT;::GetCursorPos(lpoint; // 得到鼠标位置CMenu menu;menu.CreatePopupMenu(; // 声明一个弹出式菜单menu.AppendMenu(MF_STRING,WM_DESTROY,_T("关闭 "; // 增加菜单项 " 关闭 " ,点击则发送消息 WM_DESTROY给主窗口(已隐藏 ,将程序结束。
C#WinForm-最小化或关闭时隐藏到系统托盘STEP1、添加托盘图标控件NotifyIcon(直接从工具箱中拖动添加即可)STEP2、添加(重写)窗口尺寸变动函数Form1_Resizeprivate void Form1_Resize(object sender,EventArgs e){if(this.WindowState==FormWindowState.Minimized)//最小化到系统托盘{NotifyIcon1.Visible=true;//显示托盘图标this.Hide();//隐藏窗口}}STEP3、添加(重写)关闭窗口事件private void Form1_FormClosing(object sender,FormClosingEventArgs e){//注意判断关闭事件Reason来源于窗体按钮,否则用菜单退出时无法退出!if(e.CloseReason==erClosing){e.Cancel=true;//取消"关闭窗口"事件this.WindowState=FormWindowState.Minimized;//使关闭时窗口向右下角缩小的效果NotifyIcon1.Visible=true;this.Hide();return;}}STEP4、添加双击托盘图标事件(双击显示窗口)private void NotifyIcon1_MouseDoubleClick(object sender,MouseEventArgs e) {NotifyIcon1.Visible=false;this.Show();WindowState=FormWindowState.Normal;this.Focus();}STEP5、添加托盘图标的右键菜单(具体代码略)"退出"菜单:this.Close();"显示窗口"菜单:参考STEP4PS:解决了设置“关闭时隐藏到系统托盘”时,点击“退出”菜单也无法退出的问题。
C# winForm程序开机启动和托盘显示这段时间一直在学习C#,看了书然后又在网上看了N多大神些的blog,然后自己学着做了一个像QQ托盘图标那样的小功能的Demo:(1)、在窗口上点击关闭按钮或者最小化时将托盘显示;(2)、双击托盘图标显示窗口;(3)、右键点击托盘图标提供三个菜单选项,“退出”、“隐藏”、“显示”;(4)、程序可以设置开机启动,隐藏任务栏显示。
就这四个小功能。
1、建一个WinForm程序—TestIconForm,将其属性ShowInTaskbar改为false,这样程序将不会在任务栏中显示;将MaximizeBox属性设置为false,屏蔽掉最大化按钮;把StartPosition属性改为CerternScreen,这样程序运行后,窗口将会居中显示。
2、在工具栏中的公共控件里,拖入NotifyIcon控件—testNotifyIcon,这个是程序运行任务栏右侧通知区域图标显示控件。
3、在工具栏中的菜单和工具栏里,拖入ContextMenuStrip—testContextMenuStrip,这个控件是右击时关联菜单。
4、右键testNotifyIcon选择属性,将其属性ContextMenuStrip改加为testContextMenuStrip,这个时候1和2两个步骤的两个控件就关联了,用于完成上面(3)功能。
5、右键testContextMenuStrip选择属性,进入Items,然后点击“添加”,这里添加三个菜单选项:exitMenuItem、hideMenuItem、showMenuItem,同时分别将其Text属性改为:退出、隐藏和显示。
准备工作就这些,下面是大致代码:1)、双击TestIconForm,即添加Load事件然后代码private void Form1_Load(object sender, EventArgs e){testNotifyIcon.Icon = new Icon("e:\\MyPicture\\testIcon.ico");//取得程序路径string startup = Application.ExecutablePath;//class Micosoft.Win32.RegistryKey. 表示Window注册表中项级节点,此类是注册表装RegistryKey rKey = Registry.LocalMachine;RegistryKey autoRun =rKey.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");try{autoRun.SetValue("BookServer", startup);rKey.Close();}catch (Exception exp){MessageBox.Show(exp.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);}}添加Form_Closing,SizeChanged事件代码private void Form1_FormClosing(object sender, FormClosingEventArgs e) //关闭按钮事件{e.Cancel = true;this.Hide();}private void Form1_SizeChanged(object sender, EventArgs e) //最小化事件按钮{this.Hide();}2)、给testNotifyIcon添加MouseDoubleClick事件代码private void testNotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) // 左键双击,显示{if (e.Button == MouseButtons.Left){this.Show();this.WindowState = FormWindowState.Normal;this.Activate();}}3)、进入TestIconForm单击testContextMenuStrip,然后可以看到“退出”、“隐藏”、“显示”,分别双击,添加相应的事件代码private void exitMenuItem_Click(object sender, EventArgs e){if (MessageBox.Show("你确定要退出终端服务程序吗?", "确认", MessageBoxButtons.OKCancel,MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK){testNotifyIcon.Visible = false;this.Close();this.Dispose();Application.Exit();}}private void showMenuItem_Click(object sender, EventArgs e) {this.Hide();}private void hideMenuItem_Click(object sender, EventArgs e) {this.Show();this.WindowState = FormWindowState.Normal;this.Activate();}。
(一)原理
程序实现:最小化时隐藏至托盘,双击显示窗口,右键弹出快捷菜单“退出”并添加了响应函数。
1、托盘化的原理:首先要将窗口隐藏,然后在右下角托盘中绘制图标。
2、恢复的原理:将窗口显示,再将托盘中的图片删除。
(二)总体程序实现
1、首先建立一个基于对话框的MFC程序"CTrayDlg"。
然后在TrayDlg.h文件里加入自定义消息WM_SHOWTASK:
#define WM_SHOWTASK (WM_USER + 0x100)//一般数值大于
100//{{AFX_MSG(CTrayDlg)
afx_msg LRESULT OnShowTask(WPARAM
wParam,LPARAMlParam);//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2、在TrayDlg.cpp文件里加入如下代码:
BEGIN_MESSAGE_MAP(CTrayDlg, CDialog)
//{{AFX_MSG_MAP(CTrayDlg)
中间加入消息声明:
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3、在CTrayDlg的::OnSysCommand(UINT nID, LPARAM lParam)函数体中增加一个命令响应:
if(nID==SC_MINIMIZE)
ToTray();//最小化到托盘的函数
(三)具体函数内容
1、最小化到托盘函数
TrayDlg.h中添加函数声明:
voidToTray();
TrayDlg.cpp中定义函数体:
voidCTrayDlg::ToTray()
{
NOTIFYICONDATAnid; //NOTIFYICONDATA结构包含了系统用来处理托盘图标的信息,
//它包括选择的图标、回调消息、提示消息和图标对应的窗口等内容。
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//以字节为单位的这个结构的大小
nid.hWnd=this->m_hWnd;//接收托盘图标通知消息的窗口句柄
nid.uID=IDR_MAINFRAME;//应用程序定义的该图标的ID号
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;//设置该图标的属性
nid.uCallbackMessage=WM_SHOWTASK;//应用程序定义的消息ID号,此消息传递给hWnd
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRA ME));//图标的句柄
strcpy(nid.szTip,"我的托盘我作主");//鼠标停留在图标上显示的提示信息Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标de函数,函数说明见文章附录
ShowWindow(SW_HIDE);//隐藏主窗口
}
2、恢复界面函数
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
LRESULT CTrayDlg::OnShowTask(WPARAM wParam,LPARAMlParam){
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只添加一个菜单项“退出”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“退出”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
deletelpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口DeleteTray();
}
break;
default:
break;
}
return 0;
}
3、删除托盘图标函数
在TrayDlg.h文件中添加函数DeleteTray()声明:voidDeleteTray();
cpp中其函数体为:
voidCTrayDlg::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_MAINFRA ME));
strcpy(nid.szTip,"程序名称"); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_DELETE,&nid); //在托盘区删除图标
}
附录:
Shell_NotifyIcon:
//原型WINSHELLAPI BOOL WINAPI
Shell_NotifyIcon( DWORDdwMessage,PNOTIFYICONDATApnid);
//Pnid是上面的NOTIFYICONDATA结构的指针。
dwMessage是被传递的消息,可以是以下消息之一:
//NIM_ADD:增加图标;NIM_DELETE:删除图标;NIM_MODIFY:修改图标。