MFC 任务管理器设计

在学习界面设计,因为对一些控件不熟悉,所以也参考了别人的。核心代码如下。

void CTasklistDlg::Expand()
{
    m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
    m_list.InsertColumn(0,L"Process Name",0,100);
    m_list.InsertColumn(1,L"Pid",0,100);
    m_list.InsertColumn(2,L"Path",0,380);
}

void CTasklistDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: Add your control notification handler code here
    CMenu    popup;
    popup.LoadMenu(IDR_MENU1);
    CMenu*    pM = popup.GetSubMenu(0);
    CPoint    p;
    GetCursorPos(&p);
    int    count = pM->GetMenuItemCount();
    if (m_list.GetSelectedCount() == 0)       //如果没有选中
    { 
        for (int i = 0; i < count; i++)
        {
            pM->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);          //菜单全部变灰
        }

    }
    pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this);

    *pResult = 0;
}

#include<Tlhelp32.h>
#include<Psapi.h>
#pragma comment(lib,"Psapi.lib")

BOOL CTasklistDlg::GetProcessList()
{
    BOOL result = FALSE;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap == INVALID_HANDLE_VALUE)
        return FALSE;

    int idx = 0;
    CString strID;
    HANDLE hProcess = NULL;
    CString strPath, strSys(_T("SystemRoot"));

    PROCESSENTRY32 info = { 0 };
    info.dwSize = sizeof(PROCESSENTRY32);

    BOOL bRet = Process32First(hSnap,&info);

    while (bRet)
    {
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, info.th32ProcessID);
        if (hProcess)
        {
            strPath.Empty();
            DWORD dwRet = GetModuleFileNameEx(hProcess, NULL, strPath.GetBufferSetLength(MAX_PATH), MAX_PATH);
            strPath.ReleaseBuffer();
            strPath.TrimLeft(_T("\?")); 
            if (strPath.Left(strSys.GetLength()).CompareNoCase(strSys) == 0)
            {
                TCHAR szWin[MAX_PATH] = { 0 };
                GetWindowsDirectory(szWin,MAX_PATH);
                strPath.Replace(strSys,szWin);

            }
            SHFILEINFO shInfo = { 0 };
            SHGetFileInfo(strPath, 0, &shInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON);
        }

        idx = m_list.InsertItem(m_list.GetItemCount(), info.szExeFile);
        strID.Empty();
        strID.Format(_T("%d"), info.th32ProcessID);
        m_list.SetItemText(idx, 1, strID);
        m_list.SetItemText(idx, 2, strPath);

        bRet = Process32Next(hSnap, &info);
    }

    return TRUE;
}

BOOL CTasklistDlg::AdjustPrivileges()
{
    HANDLE hToken = NULL;
    TOKEN_PRIVILEGES tp = { 0 };
    TOKEN_PRIVILEGES oldtp = { 0 };
    DWORD dwSize = sizeof(TOKEN_PRIVILEGES);
    LUID luid = { 0 };

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
        if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
            return TRUE;
        else
            return FALSE;
    }
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
        CloseHandle(hToken);
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    /* Adjust Token Privileges */
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
        CloseHandle(hToken);
        return FALSE;
    }

    // close handles
    CloseHandle(hToken);
    return TRUE;
}
void CTasklistDlg::OnKillprocess()
{
    // TODO: Add your command handler code here
    //DWORD  ProcessID = 0;
    DWORD dwProcess;
    wchar_t szBuf[MAX_PATH] = {0};
    int index = m_list.GetSelectionMark(); //获取光标所在的位置
    m_list.GetItemText(index, 1, szBuf, MAX_PATH); //获取多少行光标,然后取得数据
    dwProcess = _wtol(szBuf);
    HANDLE hProcess =  OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcess);
    if (NULL == hProcess)
    {
        MessageBox(L"打开那进程句柄失败!");
    }

    if (TerminateProcess(hProcess, 0))
    {
        PROCESSITEM* pProcItem;
        pProcItem = (PROCESSITEM*)m_list.GetItemData(index);
        delete pProcItem;
        m_list.DeleteItem(index);
        MessageBox(L"进程结束成功");
    }
    else
    {
        MessageBox(L"结束进程失败!");
    }
}


void CTasklistDlg::OnInfoExit()
{
    exit(0);
    // TODO: Add your command handler code here
}


void CTasklistDlg::OnInfoRefresh()
{
    // TODO: Add your command handler code here
    m_list.SetRedraw(FALSE);
    m_list.DeleteAllItems();
    GetProcessList();
    m_list.SetRedraw(TRUE);
    m_list.Invalidate();
    m_list.UpdateWindow();
}
原文地址:https://www.cnblogs.com/killbit/p/5117321.html