获取windows进程信息及CListCtrl控件(List Control)练习

环境:VS2010/MFC/对话框

效果图:

获取windows进程信息及CListCtrl控件(List Control)练习

目录:

1.  关于windows进程信息获取

2.  CListCtrl的使用

---------------------------------------------------------

1. windows进程信息获取

  需要包含头文件

  #include <psapi.h>
  #include <TlHelp32.h>

#pragma  comment(lib,"Psapi.lib")

主要函数使用

  CreateToolhelp32Snapshot, Process32First,OpenProcess, GetProcessMemoryInfo,Process32Next。

  PROCESSENTRY32结构中保存进程信息,

  szExeFile--进程名称

  th32ProcessId--进程Id

  cntThreads--进程包含线程数

  th32ParentProcessId--父进程ID

  pcPriClassBase--线程基础优先级

  内存信息保存在PROCESSMEMORYCOUNTERS中,windows内存项分很多种,下图是从win7任务管理器的查看--选择列中所截的图,

  获取windows进程信息及CListCtrl控件(List Control)练习

  其中,任务管理器上默认显示的是专用工作集内存,指得是该程序独有的,不和其他程序共享的。

  这一项不知道怎么获取,PROCESSMEMORYCOUNTERS中没有。程序中暂时用的workingsetsize,包含了可能被其他程序共享的内存。

 按钮响应代码:

 void CSystemProcessDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_listctrl.DeleteAllItems();
HANDLE hSnapshot;
//创建进程信息快照
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
//进程信息结构体
PROCESSENTRY32 pe;
//取得第一个
Process32First(hSnapshot, &pe);
CString str;
int i = ;
do
{
m_listctrl.InsertItem(i, pe.szExeFile);
str.Format("%d", pe.th32ProcessID);
m_listctrl.SetItemText(i,,str); str.Format("%d", pe.cntThreads);
m_listctrl.SetItemText(i,,str); str.Format("%d", pe.th32ParentProcessID);
m_listctrl.SetItemText(i,,str); str.Format("%d", pe.pcPriClassBase);
m_listctrl.SetItemText(i,,str); //根据进程ID获取内存使用信息
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pe.th32ProcessID);
if(hProcess)
{
//内存信息结构
PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)))
{
str.Format("%dK", pmc.WorkingSetSize/);
m_listctrl.SetItemText(i,,str);
}
}
i++;
}
while(Process32Next(hSnapshot, &pe));
CloseHandle(hSnapshot);
}

2. CListCtrl控件

  控件用法参考:http://www.cnblogs.com/lidabo/archive/2012/08/23/2652786.html

  直接拖一个List control到界面, 然后需要在属性中设置:

  View选项为Report模式。

  添加一个控件变量CListCtrl m_listctrl;

  初始化时在OnInitDialog()中添加:

char *tab[] = {"进程名称", "PID", "线程数", "父进程ID", "线程优先级", "内存使用"};

    for (int i = ; i < ; i++)
{
//LVCFMT_RIGHT表示文字右对齐,60为列宽
m_listctrl.InsertColumn(i, tab[i], LVCFMT_RIGHT, );
}
//设置 进程名称 列宽
m_listctrl.SetColumnWidth(, );
m_listctrl.SetColumnWidth(, );
m_listctrl.SetColumnWidth(, );
m_listctrl.SetColumnWidth(, ); //设置扩展样式为全行选取,网格,复选框
m_listctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES);

  默认是单列选取,而且除了第一列可以选,其他都不可以选, 默认没有网格,没有复选框,通过设置扩展样式修改。

上一篇:WIN7 64位系统下的服务程序更新失败问题解决


下一篇:VC/MFC ListCtrl 控件功能使用汇总(转)