C/C++远控编写第一节【10】

1.创建菜单资源  ID:  IDR_MENU_NOTIFY
                添加子菜单  显示  IDM_NOTIFY_SHOW
                退出  IDM_NOTIFY_CLOSE


2.认识一个API

 Shell_NotifyIcon
         BOOL Shell_NotifyIcon(                    //向系统托盘中加入图标
                      DWORD dwMessage,         //状态           
                      PNOTIFYICONDATA lpdata   //含有图标  消息响应 的一个结构体
         );

 3.认识NOTIFYICONDATA  结构体:

  typedef struct _NOTIFYICONDATA {
    DWORD cbSize;       //结构体自身大小
    HWND hWnd;          //托盘的父窗口  托盘发出的消息由哪一个窗口响应
    UINT uID;           //显示图标的ID
    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;
    HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;

4.在oninitdialog函数中写入加入系统脱盘的代码:  

    nid.cbSize = sizeof(nid);     //大小赋值
    nid.hWnd = m_hWnd;           //父窗口
    nid.uID = IDR_MAINFRAME;     //icon  ID
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;   //托盘所拥有的状态
    nid.uCallbackMessage = UM_ICONNOTIFY;            //回调消息
    nid.hIcon = m_hIcon;                            //icon 变量
    CString str="PCRemote远程协助软件.........";       //气泡提示
    lstrcpyn(nid.szTip, (LPCSTR)str, sizeof(nid.szTip) / sizeof(nid.szTip[0]));
    Shell_NotifyIcon(NIM_ADD, &nid);   //显示托盘

5.运行 ,在窗口销毁时托盘依然存在

6.添加WM_CLOSE消息并写入代码:   

   Shell_NotifyIcon(NIM_DELETE, &nid); //销毁图标

7.stdafx.h文件中加入自定义消息的定义
     //自定义消息

enum
{
    UM_ICONNOTIFY= WM_USER+0x100,
};

8.声明消息处理函数:    

 afx_msg void OnIconNotify(WPARAM wParam,LPARAM lParam);

9.  cpp文件中写入代码:

  void CPCRemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
    switch ((UINT)lParam)
    {
    case WM_LBUTTONDOWN: // click or dbclick left button on icon
    case WM_LBUTTONDBLCLK: // should show desktop
        if (!IsWindowVisible()) 
            ShowWindow(SW_SHOW);
        else
            ShowWindow(SW_HIDE);
        break;
    case WM_RBUTTONDOWN: // click right button, show menu
        CMenu menu;
        menu.LoadMenu(IDR_MENU_NOTIFY);
        CPoint point;
        GetCursorPos(&point);
        SetForegroundWindow();
        menu.GetSubMenu(0)->TrackPopupMenu(
            TPM_LEFTBUTTON|TPM_RIGHTBUTTON, 
            point.x, point.y, this, NULL); 
        PostMessage(WM_USER, 0, 0);
        break;
    }
}

10.添加消息响应:

  ON_MESSAGE(UM_ICONNOTIFY, (LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))OnIconNotify)  

11.添加显示菜单消息响应

void CPcRemoteDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值  点击界面关闭时响应函数
	//Shell_NotifyIcon(NIM_DELETE, &nid); //销毁图标
	//
	if (!IsWindowVisible())
		ShowWindow(SW_SHOW);
	else
		ShowWindow(SW_HIDE);
	return;
}

void CPcRemoteDlg::OnNotifyClose()
{
	// TODO: 在此添加命令处理程序代码
	OnDestroy();
	Shell_NotifyIcon(NIM_DELETE, &nid); //销毁图标
}

void CPcRemoteDlg::OnNotifyShow()
{
	// TODO: 在此添加命令处理程序代码
	ShowWindow(SW_SHOW);
}

12:运行结果:

总结:还存在问题,退出后,该程序进程你并没有关闭

本节附带代码(项目为止所有代码):

https://download.csdn.net/download/sunjikui1255326447/11172714

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值