首页
社区
课程
招聘
[旧帖] 托盘程序(Tray) 0.00雪花
发表于: 2012-6-6 15:20 1092

[旧帖] 托盘程序(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   :   鼠标移动到托盘图标上时的提示文字。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//