模拟任务资源管理器的小程序

一 . 新建基于对话框的MFC项目

在对话框上添加ListCtrl控件 , 右键添加变量 , 在OnInitDialog中初始化

    MylistCtrl.InsertColumn(0,_T("Name"),0,100);
    MylistCtrl.InsertColumn(1,_T("ProcessID"),0,100);
    MylistCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);//点击任意列可选中一行
    GetProcess();

二 . 获得每个进程信息

获取系统中正在运行的进程信息  :CreateToolhelp32Snapshot

获得运行的进程链表的首部  :Process32First

获得运行的进程链表的下一个 :Process32Next

通配符:_T()  和 TCHAR:

    当为Unicode字符集(即宽字符集)的时候,变量为L" "和 char;          

    当为多字节字符集的时候,变量为" "  和 wchar

void CProcessDlg::GetProcess()
{
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);
    HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(handle == INVALID_HANDLE_VALUE) return;
    BOOL bflag = Process32First(handle,&pe32);
    CString str;
    while(bflag)
    {   
        str.Format(_T("%d"),pe32.th32ProcessID);//将数字转换成字符串
        MylistCtrl.InsertItem(0,pe32.szExeFile);//向每一行中插入进程名
        MylistCtrl.SetItemText(0,1,str);//向每一行的第二列中插入进程序号
        bflag = Process32Next(handle,&pe32);
    }
}

三  . 当点击结束按钮的功能函数

1.获得选中项 :(索引)GetSelectionMark() , (文本)GetItemText()

2.获得句柄   :OpenProcess()

3.杀死进程   :TerminateProcess()

void CProcessDlg::OnBnClickedButton1()
{
    //1.获得选中项
    int index;
    CString str;
    index = MylistCtrl.GetSelectionMark();
    if(index != -1)//获取索引成功
    str = MylistCtrl.GetItemText(index , 1);//index为文本将检索项的索引。1为指定文本要检索的子项
    //2.获得句柄
    HANDLE h_process = OpenProcess(PROCESS_TERMINATE ,FALSE ,_ttoi(str));//将CString转换为int
    int n = GetLastError();//取得上一个函数操作时所产生的错误代码。
    if(h_process)
    {
        TerminateProcess(h_process,-1);//第二个参数为发给操作系统的退出码
        MylistCtrl.DeleteItem(index);//从listctrl中删除
    }
}
GetLastError()函数返回的错误值可以在:工具->错误查找中输入错误码查找错误

小知识点:             strlen() 和 sizeof()
char* p = "abcde";        5      4
char p[10] = "abcde";       5      10
char p[] = "abcde";        5      6
strlen():计算字符串的长度,以'为字符串结束标记。
sizeof() :计算的则是分配的数组所占的内存空间的大小,不受里面存储的内容影响

区别:
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。 
该类型保证能容纳实现所建立的最大对象的字节大小
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''''结尾的。 
sizeof还可以用函数做参数为函数的返回类型所占的空间大小。函数的返回类型不能是void。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了
5.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数
6.sizeof在编译的时候计算过了
 
原文地址:https://www.cnblogs.com/Lune-Qiu/p/8378403.html