• 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();
    }
  • 相关阅读:
    c#调用java
    Shell脚本之Crontab的格式
    windows安装的mysql中文乱码的坑
    要成为一个 Java 架构师得学习哪些知识?
    月薪 30K Java 程序员,需要掌握哪些技术?
    职场
    资源汇总
    SpringBoot布道系列 | 目录汇总 | 2019持续更新ing
    史上最简单的 SpringCloud 教程 | 终章
    SpringBoot 企业级核心技术学习专题
  • 原文地址:https://www.cnblogs.com/killbit/p/5117321.html
Copyright © 2020-2023  润新知