一个用于启动/停止特定服务的托盘程序——VS2008实现

本文介绍了如何使用Visual Studio 2008创建一个MFC应用程序,该程序能够将主窗口最小化到系统托盘。通过添加和修改函数,包括MinimizeToTray()、ONShowTask(),以及处理WM_SHOWTASK和WM_DESTROY消息,实现了在托盘区域显示图标并在关闭窗口时隐藏到托盘的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 新建一个MFC应用程序,选择“基于对话框”,其余默认选择。

2. 在“资源视图”中选择Dialog->IDD_XXX_DIALOG,在主界面视图上删除"To Do"标识。“确定”按钮及“取消”按钮可选。

3. 在“类视图”中选取CXXXDlg类,右键选中“添加”->“添加函数”,添加函数void MinimizeToTray()。系统会自动生成CXXXDlg类的函数声明和函数定义(空)。在函数定义中,我们添加如下内容:

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));
wcscpy(nid.szTip,L"计划任务提醒");//信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
ShowWindow(SW_HIDE);//隐藏主窗口

这段代码会在托盘区添加一个图标,并隐藏主界面。

4. 上面的代码中有一个WM_SHOWTASK消息,需要我们自行定义。在XXXDlg.h文件中,"#progma once"后面我们加入如下语句:

#define WM_SHOWTASK       WM_USER + 100

5. 依然在“类视图”中选取CXXXDlg类,选择“添加函数”,添加函数LRESULT ONShowTask(WPARAM wParam, LPARAM lParam)。可能需要你在XXXDlg.h中将该函数的声明加前缀"afx_msg"。函数定义中我们添加如下内容:

//wParam接收的是图标的ID,而lParam接收的是鼠标的行为

if( wParam != IDR_MAINFRAME )
{
    return 1;
}

switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单
    {
        LPPOINT lpoint=new tagPOINT;
        ::GetCursorPos(lpoint);//得到鼠标位置
        CMenu menu;
        menu.LoadMenu(IDR_RMENU);
        menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_NONOTIFY|TPM_RETURNCMD,lpoint->x,lpoint->y,this);

        //资源回收
        HMENU hmenu=menu.Detach();
        menu.DestroyMenu();
        delete lpoint;
        break;
    }
case WM_LBUTTONUP://左键起来时弹出快捷菜单
    {
        LPPOINT lpoint=new tagPOINT;
        ::GetCursorPos(lpoint);//得到鼠标位置
        CMenu menu;
        menu.LoadMenu(IDR_LMENU);
        menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_NONOTIFY|TPM_RETURNCMD,lpoint->x,lpoint->y,this);

        //资源回收
        HMENU hmenu=menu.Detach();
        menu.DestroyMenu();
        delete lpoint;
        break;
    }
case WM_LBUTTONDBLCLK://双击左键的处理
    {
        this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
        break;
    }
default:
    break;
}
return LRESULT();

6. 在消息队列里面添加以上函数的相应响应函数:

ON_MESSAGE(WM_SHOWTASK, ONShowTask)

7. 为了在关闭窗口后托盘图标可以正常删除,需要捕捉WM_DESTROY消息。在对话框属性中点选“消息”,在WM_DESTROY后选取"<添加>OnDestroy",然后为该响应函数添加以下代码:

CDialog::OnDestroy();

//删除托盘图标
NOTIFYICONDATA tnid;    
tnid.cbSize = sizeof(NOTIFYICONDATA);    
tnid.hWnd = m_hWnd;    
tnid.uID = IDR_MAINFRAME;    

//用NIM_DELETE删除图标   
Shell_NotifyIcon(NIM_DELETE, &tnid);

8. 为了能够让主窗口可以被最小化到系统托盘,我们准备通过两种办法来达到这一目标。一、点击主界面右上角关闭按钮,不再直接关闭程序,而是最小化至系统托盘。我们需要在OnSysCommand()函数中拦截SC_CLOSE消息,为其添加如下代码:

if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
}
else if ( nID == SC_CLOSE )
{
    MinimizeToTray();
}
else
{
    CDialog::OnSysCommand(nID, lParam);
}

二、我们在对话框中增加一个按钮,名为“隐藏”,并将其ID改为"IDC_HIDE"。双击按钮,转到其响应函数,并为其添加如下代码:

MinimizeToTray();

至此,主界面可以通过以上两种方式最小化至系统托盘。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值