-
-
[旧帖] 托盘程序(Tray) 0.00雪花
-
发表于: 2012-6-6 15:20 1092
-
托盘程序(Tray)
VC++6.0,XPsp3系统平台
首先,若你能先百度最好,。。。(高手请指点一下,多谢了!!)
1、托盘区绘一图标
2、将程序隐藏
3、再对托盘图标的单击事件,进行消息响应处理
(1对-1, 2对-2, 3对-3)
-1
分别解释,绘制图标以及确定图标所传送消息的函数只有一个,就是
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid );
这个函数呢,负责向系统传递消息,以添加、修改或删除托盘区的图标。她的返回值呢,是个布尔类型的。就是说,如果返回0,失败,非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;
(为了不影响编程主线,具体的结构解释,见后)
-2
托盘编程例子
跟我做,VC++6.0,XPsp3系统平台,vc6.0打开,文件/新建/工程/MFC AppWizard(exe),
工程名称Tray,位置 D:\123\,(具体看你的目录)其余默认,OK,确定,弹出的对话框,选基本对话框,完成。F7编译一下!
然后在VC++6.0的工作空间的资源里,选Dialog资源的IDD_TRAY_DIALOG,双击,弹出对话框资源,所见即所得,加一个 控件按钮。右键属性。标题改为 托盘。其余不变。双击托盘 按钮,进入 void CTrayDlg::OnButton1() 内,加入如下代码:
void CTrayDlg::OnButton1()
{
// TODO: Add your control notification handler code here
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_TASKBAR;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"托盘程序启动");//信息提示条为“托盘程序启动”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
ShowWindow(SW_HIDE);//单击托盘按钮后,隐藏主窗口到托盘上,加不加this-> 都行
}
然后在CTrayDlg.cpp的前面,加 #define WM_TASKBAR 1000
重新编译,OK,Ctrl+F5 运行,托盘已运行,鼠标移动到那,有 计划任务提醒 ,字样,确定Tray 托盘已运行。但左键,右键,都没反应,why,因为我们,还没给它加,消息处理!如何关闭呢,用任务管理器,进程里有个Tray.exe ,选中,结束它。
-3
对托盘加消息响应函数,注意:消息 WM_TASKBAR 要与 消息响应函数 CTrayDlg::OnTaskbar()对应,即:加3个块,
① 在头文件CTrayDlg.h 的 //{{AFX_MSG(CTrayDlg)
。。。
afx_msg LRESULT OnTaskbar(WPARAM wParam,LPARAM lParam); // 在这里加上这句
//}}AFX_MSG
消息响应函数的原型,
② 然后在 CTrayDlg.cpp 的
BEGIN_MESSAGE_MAP(CTrayDlg, CDialog) //注意在这里是CTrayDlg,而不是 //{{AFX_MSG_MAP(CTrayDlg) //CAboutDlg,
。。。
ON_MESSAGE(WM_TASKBAR,OnTaskbar) //加上这句映射宏
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
③ 然后在 CTrayDlg.cpp 的末尾加上 OnTaskbar()函数体,托盘的消息响应函数。具体如下:
LRESULT CTrayDlg::OnTaskbar(WPARAM wParam,LPARAM lParam)
{
UINT uMouseMsg=(UINT)lParam;//取鼠标消息
switch(uMouseMsg)
{
case WM_LBUTTONDOWN://这一区域,可以加你想执行的代码
ShowWindow(SW_HIDE);
AfxMessageBox("鼠标左键双击图标");
ShowWindow(SW_SHOWNORMAL);
break;
case WM_RBUTTONUP://这一区域,可以加你想执行的代码
AfxMessageBox("鼠标右键单击图标");
break;
default:
break;
}
return 0;
}
重新编译,OK,Ctrl+F5 运行,托盘已运行,有主对话框窗口,任务栏上有图标,单击托盘按钮,主对话框隐藏,缩小到托盘,左键点托盘图标,显示出主对话框,右键单击,弹出消息提示,完成!还可以对最小化,等进行托盘化,这里不弄了,你来吧!
最后把 _NOTIFYICONDATA该结构各个参数进行刨析:
cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。
HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。自然了,大多数情况下是this->m_hWnd喽。
uID : 在工程中定义的图标ID
uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述
hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。
uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。
szTip : 鼠标移动到托盘图标上时的提示文字。
VC++6.0,XPsp3系统平台
首先,若你能先百度最好,。。。(高手请指点一下,多谢了!!)
1、托盘区绘一图标
2、将程序隐藏
3、再对托盘图标的单击事件,进行消息响应处理
(1对-1, 2对-2, 3对-3)
-1
分别解释,绘制图标以及确定图标所传送消息的函数只有一个,就是
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid );
这个函数呢,负责向系统传递消息,以添加、修改或删除托盘区的图标。她的返回值呢,是个布尔类型的。就是说,如果返回0,失败,非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;
(为了不影响编程主线,具体的结构解释,见后)
-2
托盘编程例子
跟我做,VC++6.0,XPsp3系统平台,vc6.0打开,文件/新建/工程/MFC AppWizard(exe),
工程名称Tray,位置 D:\123\,(具体看你的目录)其余默认,OK,确定,弹出的对话框,选基本对话框,完成。F7编译一下!
然后在VC++6.0的工作空间的资源里,选Dialog资源的IDD_TRAY_DIALOG,双击,弹出对话框资源,所见即所得,加一个 控件按钮。右键属性。标题改为 托盘。其余不变。双击托盘 按钮,进入 void CTrayDlg::OnButton1() 内,加入如下代码:
void CTrayDlg::OnButton1()
{
// TODO: Add your control notification handler code here
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_TASKBAR;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"托盘程序启动");//信息提示条为“托盘程序启动”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
ShowWindow(SW_HIDE);//单击托盘按钮后,隐藏主窗口到托盘上,加不加this-> 都行
}
然后在CTrayDlg.cpp的前面,加 #define WM_TASKBAR 1000
重新编译,OK,Ctrl+F5 运行,托盘已运行,鼠标移动到那,有 计划任务提醒 ,字样,确定Tray 托盘已运行。但左键,右键,都没反应,why,因为我们,还没给它加,消息处理!如何关闭呢,用任务管理器,进程里有个Tray.exe ,选中,结束它。
-3
对托盘加消息响应函数,注意:消息 WM_TASKBAR 要与 消息响应函数 CTrayDlg::OnTaskbar()对应,即:加3个块,
① 在头文件CTrayDlg.h 的 //{{AFX_MSG(CTrayDlg)
。。。
afx_msg LRESULT OnTaskbar(WPARAM wParam,LPARAM lParam); // 在这里加上这句
//}}AFX_MSG
消息响应函数的原型,
② 然后在 CTrayDlg.cpp 的
BEGIN_MESSAGE_MAP(CTrayDlg, CDialog) //注意在这里是CTrayDlg,而不是 //{{AFX_MSG_MAP(CTrayDlg) //CAboutDlg,
。。。
ON_MESSAGE(WM_TASKBAR,OnTaskbar) //加上这句映射宏
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
③ 然后在 CTrayDlg.cpp 的末尾加上 OnTaskbar()函数体,托盘的消息响应函数。具体如下:
LRESULT CTrayDlg::OnTaskbar(WPARAM wParam,LPARAM lParam)
{
UINT uMouseMsg=(UINT)lParam;//取鼠标消息
switch(uMouseMsg)
{
case WM_LBUTTONDOWN://这一区域,可以加你想执行的代码
ShowWindow(SW_HIDE);
AfxMessageBox("鼠标左键双击图标");
ShowWindow(SW_SHOWNORMAL);
break;
case WM_RBUTTONUP://这一区域,可以加你想执行的代码
AfxMessageBox("鼠标右键单击图标");
break;
default:
break;
}
return 0;
}
重新编译,OK,Ctrl+F5 运行,托盘已运行,有主对话框窗口,任务栏上有图标,单击托盘按钮,主对话框隐藏,缩小到托盘,左键点托盘图标,显示出主对话框,右键单击,弹出消息提示,完成!还可以对最小化,等进行托盘化,这里不弄了,你来吧!
最后把 _NOTIFYICONDATA该结构各个参数进行刨析:
cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。
HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。自然了,大多数情况下是this->m_hWnd喽。
uID : 在工程中定义的图标ID
uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述
hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。
uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。
szTip : 鼠标移动到托盘图标上时的提示文字。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- PE文件头所在页面的属性如何设置? 913
- [分享]几个内核结构1 983
- [分享]dll注入简化2 1183
- [分享][分享]dll简化注入 1996
- 托盘程序(Tray) 1093
看原图
赞赏
雪币:
留言: