vs2010: 写了一个服务监控程序

用vs写了一个服务监控程序,一个ListCtrl显示所有的系统服务。两个按钮分别控制所点击的服务开始和结束。

创建了一个新线程监控服务的状态变化、中间碰到两个问题 纠结了好久。

一个是  控件选择问题。

首先用的是 ListBox控件,但是发现ListBox 太不好定位了 要显示第二列的 服务状态,太不容易了。其实listbox 控件也可以多列显示  但是它是从第一列开始  一个一个的显示过来的。而且  第一列没有填充完成  是设置不了第二列的值的。所以 很蛋疼。纠结了好久 只好换控件,换成listCtrl    多列显示

第二个问题是  ListCtrl  控件没有设置report风格。   

ListCtrl控件没有设置report属性就导致  无论怎么插入数据都值显示第一列。 后来我试了 设置为Icon 或者report都可以,但是 设置为small Icon 或者List风格就不可以。  Small Icon 只显示第一列  List风格只显示第一列的第一个数据    

其实前面我是设置了report风格的,但是设置了运行便报错。(编译可以通过)一串的包含这个关键字winCtrl2   不知道是什么原因  如果以后解决了 一定要回头来看看。。       后来通过m_list1.ModifyStyle(0,LVS_REPORT);设置风格为report就 可以了 。这时候我把这句代码注释掉  再重新在属性窗口设置 View属性为report。   就可以运行了


还有个问题有待解决:

怎么样 实现  像任务管理器的  双击某列的label ,使该列的服务排序 (需要数据绑定)


主要代码




将程序图标加入任务栏,就像一个客户端:

用到结构体NOTIFYICONDATA 

NOTIFYICONDATA *notifyIconData=new NOTIFYICONDATA;
notifyIconData->cbSize=sizeof(NOTIFYICONDATA);//结构体内存空间
notifyIconData->hWnd=AfxGetMainWnd()->m_hWnd;//关联主窗口句柄
notifyIconData->uID=IDI_SERVEMANAGE;              //图标ID号
notifyIconData->uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;//存储
notifyIconData->uCallbackMessage=WM_SHOWTASK;//回调函数的消息
notifyIconData->hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_SERVEMANAGE));

TCHAR app_name[100]=TEXT("服务管理程序");//鼠标附上去显示的程序名称
memcpy(notifyIconData->szTip,app_name,sizeof(app_name));

发送添加到任务栏图标的消息用到  Shell_NotifyIcon函数
Shell_NotifyIcon(NIM_ADD,notifyIconData);


其次:  还要添加WM_SHOWTASK函数

C***Dlg.h中添加afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam);  消息映射函数声明

C***Dlg.cpp中添加ON_MESSAGE(WM_SHOWTASK,&CServerManageDlg::OnShowTask)消息映射

并实现 LRESULT OnShowTask(WPARAM wParam,LPARAM lParam)函数


LRESULT CServerManageDlg::OnShowTask(WPARAM wParam,LPARAM lParam)
{
if(wParam!= IDI_SERVEMANAGE)
{
return 1;
}
switch(lParam)
{
case WM_RBUTTONUP:
{//这个括号一定要加,是限制menu这个变量的作用域的,如果不加,会报变量定义被case标签跳过的错误
LPPOINT  lpoint=new tagPOINT;
::GetCursorPos(lpoint);
CMenu menu;
menu.CreatePopupMenu();
//menu.AppendMenu(MF_STRING,WM_SIZE,TEXT("关闭"));
menu.AppendMenu(MF_STRING,WM_DESTROY,TEXT("退出"));
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this,FALSE);
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;

break;
}
case WM_LBUTTONDBLCLK:
this->ShowWindow(SW_SHOWNORMAL);
break;

default:
break;
}
return 0;
}

实现最大化窗口和最小化窗口

void CServerManageDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else if(nID==SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
}
else if(nID==SC_MAXIMIZE)
{
ShowWindow(SW_MAXIMIZE);
}

else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值