获取 Windows 任务管理器中应用程序和进程 任务

  1. 获取应用程序:
  2. #pragma once
  3. #include "afxcmn.h"
  4. /*判断窗口是否是正常运行还是未响应的*/
  5. typedef   BOOL  (WINAPI *PROCISHUNGAPPWINDOW)( HWND );
  6. typedef   BOOL  (WINAPI *PROCISHUNGTHREAD)( DWORD );
  7. // CEnumWindowsDlg 对话框
  8. class  CEnumWindowsDlg :  public  CDialog
  9. {
  10.     DECLARE_DYNAMIC(CEnumWindowsDlg)
  11. public :
  12.     CEnumWindowsDlg(CWnd* pParent = NULL);    // 标准构造函数
  13.      virtual  ~CEnumWindowsDlg();
  14. // 对话框数据
  15.      enum  { IDD = IDD_ENUMWINDOWS_DIALOG };
  16. protected :
  17.      virtual   void  DoDataExchange(CDataExchange* pDX);     // DDX/DDV 支持
  18.     DECLARE_MESSAGE_MAP()
  19. public :
  20.     afx_msg  void  OnDestroy();
  21.      /*刷新CListCtrl上的任务*/
  22.     afx_msg  void  OnBnClickedButtonRefrush();
  23.      virtual   BOOL  OnInitDialog();
  24. public :
  25.     CListCtrl m_ListWnds;
  26.     CImageList m_ImgList;
  27.     PROCISHUNGAPPWINDOW m_pIsHungAppWindow;
  28.     PROCISHUNGTHREAD m_pIsHungThread;
  29.      /* 判断当前操作系统是否是Windows NT/2000以上
  30.     不同的操作系统,判断程序是否运行正常的方式是不一样的*/
  31.      BOOL  m_bIsNT;
  32.      bool  m_bLoadIcon;    //是否加载icon
  33. private :
  34.      BOOL  GetOSVersion();
  35.      BOOL   static  CALLBACK enumProc( HWND  hwnd,  LPARAM  lParam);
  36.      HICON   static  GetWindowsIcon( HWND  hwnd); 
  37.      BOOL  bWindowsRun( HWND  hwnd);  //是否在运行
  38.      void  CloseHwnd( HWND  hwnd);
  39.      BOOL   static  CALLBACK TerminateAppEnum(  HWND  hwnd,  LPARAM  lParam );
  40.      DWORD  WINAPI TerminateApp(  DWORD  dwPID,  DWORD  dwTimeout );
  41.      void  InsertListItem( HWND  hwnd,CString strName);
  42.      void  SaveIcon( HICON    hIconToSave,    LPCTSTR    sIconFileName);
  43.     
  44. };
  1. // EnumWindowsDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "VNCServerTestMFC.h"
  5. #include "EnumWindowsDlg.h"
  6. /*定义关闭窗口返回值*/
  7. #define TA_FAILED (0x0L)
  8. #define TA_SUCCESS_KILL (0x2L)
  9. #define TA_SUCCESS_CLEAN (0x1L)
  10. // CEnumWindowsDlg 对话框
  11. IMPLEMENT_DYNAMIC(CEnumWindowsDlg, CDialog)
  12. CEnumWindowsDlg::CEnumWindowsDlg(CWnd* pParent  /*=NULL*/ )
  13.     : CDialog(CEnumWindowsDlg::IDD, pParent)
  14.     ,m_bLoadIcon( true )
  15. {
  16. }
  17. CEnumWindowsDlg::~CEnumWindowsDlg()
  18. {
  19. }
  20. void  CEnumWindowsDlg::DoDataExchange(CDataExchange* pDX)
  21. {
  22.     CDialog::DoDataExchange(pDX);
  23.     DDX_Control(pDX, IDC_LIST_WINDOWS, m_ListWnds);
  24. }
  25. BEGIN_MESSAGE_MAP(CEnumWindowsDlg, CDialog)
  26.     ON_WM_DESTROY()
  27.     ON_BN_CLICKED(IDC_BUTTON_REFRUSH, &CEnumWindowsDlg::OnBnClickedButtonRefrush)
  28. END_MESSAGE_MAP()
  29. // CEnumWindowsDlg 消息处理程序
  30. void  CEnumWindowsDlg::OnDestroy()
  31. {
  32.     CDialog::OnDestroy();
  33.      // TODO: 在此处添加消息处理程序代码
  34.      if (m_ImgList.GetSafeHandle())
  35.     {
  36.         m_ImgList.DeleteImageList();
  37.     }
  38. }
  39. BOOL  CEnumWindowsDlg::OnInitDialog()
  40. {
  41.     CDialog::OnInitDialog();
  42.      // TODO:  在此添加额外的初始化
  43.     CRect rect;
  44.     m_ListWnds.GetClientRect(rect);
  45.      //获得原有风格
  46.      DWORD  dwStyle = ::GetWindowLong(m_ListWnds.m_hWnd, GWL_STYLE);
  47.     dwStyle &= ~(LVS_TYPEMASK);
  48.     dwStyle &= ~(LVS_EDITLABELS);
  49.      //设置新风格
  50.     SetWindowLong(m_ListWnds.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
  51.      //设置扩展风格
  52.      DWORD  styles =LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES;
  53.     ListView_SetExtendedListViewStyleEx(m_ListWnds.m_hWnd, styles, styles );
  54.     LV_COLUMN lvcolumn;
  55.      TCHAR  rgtsz[2][10] = {_T( "任务" ), _T( "状态" )};
  56.      for ( int  i=0;i<2;i++)
  57.     {
  58.         lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
  59.         lvcolumn.fmt = LVCFMT_LEFT;
  60.         lvcolumn.pszText = rgtsz[i];
  61.         lvcolumn.iSubItem = i;
  62.         lvcolumn.iOrder = i;
  63.          if (i==0)
  64.             lvcolumn.cx = rect.Width()*3/5 ;
  65.          else
  66.             lvcolumn.cx = rect.Width()*2/5;
  67.         m_ListWnds.InsertColumn(i, &lvcolumn);
  68.     }
  69.     GetOSVersion();
  70.     OnBnClickedButtonRefrush();
  71.      return  TRUE;   // return TRUE unless you set the focus to a control
  72.      // 异常: OCX 属性页应返回 FALSE
  73. }
  74. void  CEnumWindowsDlg::SaveIcon( HICON    hIconToSave,    LPCTSTR    sIconFileName)   
  75. {   
  76.      if (hIconToSave==NULL   ||   sIconFileName==NULL)   
  77.          return ;   
  78.      //warning:   this   code   snippet   is   not   bullet   proof.   
  79.      //do   error   check   by   yourself   [masterz]   
  80.     PICTDESC   picdesc;   
  81.     picdesc.cbSizeofstruct   =    sizeof (PICTDESC);   
  82.     picdesc.picType   =   PICTYPE_ICON   ;                           
  83.     picdesc.icon.hicon   =   hIconToSave;   
  84.     IPicture*   pPicture=NULL;   
  85.     OleCreatePictureIndirect(&picdesc,   IID_IPicture,   TRUE,( VOID **)&pPicture);   
  86.     LPSTREAM   pStream;   
  87.     CreateStreamOnHGlobal(NULL,TRUE,&pStream);   
  88.      LONG    size;   
  89.      HRESULT    hr=pPicture->SaveAsFile(pStream,TRUE,&size);   
  90.      char    pathbuf[1024];   
  91.     strcpy(pathbuf,sIconFileName);   
  92.     CFile   iconfile;   
  93.     iconfile.Open(pathbuf,   CFile::modeCreate|CFile::modeWrite);   
  94.     LARGE_INTEGER   li;   
  95.     li.HighPart   =0;   
  96.     li.LowPart   =0;   
  97.     ULARGE_INTEGER   ulnewpos;   
  98.     pStream->Seek(   li,STREAM_SEEK_SET,&ulnewpos);   
  99.      ULONG    uReadCount   =   1;   
  100.      while (uReadCount>0)   
  101.     {   
  102.         pStream->Read(pathbuf, sizeof (pathbuf),&uReadCount);   
  103.          if (uReadCount>0)   
  104.             iconfile.Write(pathbuf,uReadCount);   
  105.     }   
  106.     pStream->Release();   
  107.     iconfile.Close();   
  108. }   
  109. BOOL  CALLBACK CEnumWindowsDlg::enumProc( HWND  hwnd,  LPARAM  lParam)
  110. {
  111.      if  (hwnd == NULL)
  112.     {
  113.          return  FALSE;
  114.     }
  115.     CEnumWindowsDlg * pDlg = (CEnumWindowsDlg *)lParam;
  116.      if  ( hwnd == pDlg->m_hWnd ) //这是为了不把自己这个程序列出来
  117.     {
  118.          return  TRUE;
  119.     }
  120.      if  (::IsWindow(hwnd) && ::IsWindowVisible(hwnd) && /
  121.         ((GetWindowLong(hwnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW)!=WS_EX_TOOLWINDOW)&&/
  122.         (GetWindowLong(hwnd, GWL_HWNDPARENT)==0))
  123.     {
  124.          TCHAR  szCap[255] = {0};
  125.         ::GetWindowText(hwnd, szCap, 255);
  126.          if  (strlen(szCap) == 0)
  127.         {
  128.              return  TRUE;
  129.         }
  130.         CString strText( "" );
  131.         pDlg->GetParent()->GetWindowText(strText);
  132.          if  (lstrcmp(strText,szCap) == 0)
  133.         {
  134.              return  TRUE;
  135.         }
  136.         TRACE( "%s/n" ,szCap);
  137.         pDlg->InsertListItem(hwnd,szCap);
  138.     }
  139.      return  TRUE;
  140. }
  141. void  CEnumWindowsDlg::InsertListItem( HWND  hwnd,CString strName)
  142. {
  143.      HICON  hIcon=GetWindowsIcon(hwnd);
  144.     
  145.      if (m_bLoadIcon)
  146.     {
  147.         m_ImgList.Add(hIcon);
  148.          return ;
  149.     }
  150.      bool  bRun=bWindowsRun(hwnd);
  151.      int  nIndex =m_ListWnds.GetItemCount();
  152.     LV_ITEM    lvitemAdd = {0};
  153.     lvitemAdd.mask =  LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
  154.     lvitemAdd.iItem = nIndex ;
  155.     lvitemAdd.iSubItem = 0;
  156.     lvitemAdd.pszText =( LPSTR )( LPCSTR )strName;
  157.     lvitemAdd.iImage =nIndex;
  158.     lvitemAdd.lParam = ( LPARAM )hwnd;
  159.      if  (m_ListWnds.InsertItem(&lvitemAdd) != -1){
  160.         LV_ITEM lvitem = {0};
  161.         lvitem.mask = LVIF_TEXT;
  162.         lvitem.iItem = nIndex ;
  163.         lvitem.iSubItem = 1;
  164.         lvitem.pszText =_T( "正在运行" );
  165.         m_ListWnds.SetItem(&lvitem);
  166.     }   
  167. }
  168. HICON  CEnumWindowsDlg::GetWindowsIcon( HWND  hwnd)
  169. {
  170.      HICON  hIcon = NULL;
  171.     hIcon = ( HICON )::GetClassLong(hwnd,GCL_HICONSM);
  172.      if (hIcon == NULL)
  173.     {
  174.         hIcon = ( HICON )::GetClassLong(hwnd,GCL_HICON);
  175.     }
  176.      if (hIcon == NULL)
  177.     {
  178.         hIcon = ( HICON )::SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0);
  179.     }
  180.      if (hIcon == NULL)
  181.     {
  182.         hIcon = ( HICON )::SendMessage(hwnd, WM_GETICON, ICON_BIG, 0);
  183.     }
  184.      return  hIcon;
  185. }
  186. BOOL  CEnumWindowsDlg::GetOSVersion()
  187. {
  188.      BOOL  bRetVal=TRUE;
  189.     OSVERSIONINFO osver = {0};
  190.     osver.dwOSVersionInfoSize =  sizeof (OSVERSIONINFO);
  191.      if  (!GetVersionEx(&osver))
  192.     {
  193.         bRetVal = FALSE;
  194.     }
  195.      if (bRetVal == TRUE)
  196.     {
  197.          if  (osver.dwPlatformId&VER_PLATFORM_WIN32_NT)
  198.         {
  199.             m_bIsNT = TRUE;
  200.         }
  201.          else
  202.         {
  203.             m_bIsNT = FALSE;
  204.         }
  205.     }
  206.      //获取那两个函数指针
  207.      HMODULE  hUser32 = ::GetModuleHandle( "user32" );
  208.      if  (!hUser32)
  209.     {
  210.         bRetVal = FALSE;
  211.     }
  212.      if (bRetVal == TRUE)
  213.     {
  214.         m_pIsHungAppWindow = (PROCISHUNGAPPWINDOW)GetProcAddress( hUser32, "IsHungAppWindow"  );
  215.         m_pIsHungThread = (PROCISHUNGTHREAD) GetProcAddress( hUser32, "IsHungThread"  );
  216.          if  (!m_pIsHungAppWindow && !m_pIsHungThread)
  217.         {
  218.             bRetVal = FALSE;
  219.         }
  220.     }
  221.      return  bRetVal;
  222. }
  223. BOOL  CEnumWindowsDlg::bWindowsRun( HWND  hwnd)
  224. {
  225.      //于是判断,窗口是否是正常运行,还是未响应,代码如下
  226.      BOOL  bIsHung =FALSE;
  227.      if (m_bIsNT == TRUE)
  228.         bIsHung = m_pIsHungAppWindow(hwnd);
  229.      else
  230.         bIsHung =m_pIsHungThread(GetWindowThreadProcessId(hwnd,NULL));
  231.      return  bIsHung;
  232. }
  233. void  CEnumWindowsDlg::CloseHwnd( HWND  hwnd) //4.结束任务
  234.     ::PostMessage(hwnd,WM_CLOSE,0,0);
  235.      //不过调用这个,有时候不一定一下能把窗口关了,比如窗口没响应了,就关不了
  236.     ::PostMessage(hwnd,WM_CLOSE,0,0);
  237.     ::Sleep(300);
  238.      //如果窗口还没有被关,继续想办法
  239.      if (::IsWindow(hwnd))
  240.     {
  241.          DWORD  dwProcessID = 0;
  242.         ::GetWindowThreadProcessId(hwnd,&dwProcessID);
  243.          if (TerminateApp(dwProcessID,500) != TA_FAILED)
  244.         {
  245.              return ; //结束成功了
  246.         }
  247.     }
  248.      return  ;
  249. }
  250. //TerminateApp是这样的
  251. DWORD  WINAPI CEnumWindowsDlg::TerminateApp(  DWORD  dwPID,  DWORD  dwTimeout )
  252. {
  253.      HANDLE  hProc ;
  254.      DWORD  dwRet ;
  255.      // If we can't open the process with PROCESS_TERMINATE rights,
  256.      // then we give up immediately.
  257.     hProc = ::OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,dwPID);
  258.      if (hProc == NULL)
  259.     {
  260.          return  TA_FAILED ;
  261.     }
  262.      // TerminateAppEnum() posts WM_CLOSE to all windows whose PID
  263.      // matches your process's.
  264.     EnumWindows((WNDENUMPROC)TerminateAppEnum, ( LPARAM ) dwPID);
  265.      // Wait on the handle. If it signals, great. If it times out,
  266.      // then you kill it.
  267.      if (WaitForSingleObject(hProc, dwTimeout)!=WAIT_OBJECT_0)
  268.         dwRet=(TerminateProcess(hProc,0)?0x2L:0x0L); //TA_SUCCESS_KILL:TA_FAILED);
  269.      else
  270.         dwRet =0x1L; // TA_SUCCESS_CLEAN ;
  271.     CloseHandle(hProc);
  272.      return  dwRet ;
  273. }
  274. //又有一个回调函数
  275. BOOL  CALLBACK CEnumWindowsDlg::TerminateAppEnum(  HWND  hwnd,  LPARAM  lParam )
  276. {
  277.      DWORD  dwID ;
  278.     ::GetWindowThreadProcessId(hwnd, &dwID) ;
  279.      if (dwID == ( DWORD )lParam)
  280.     {
  281.         ::PostMessage(hwnd, WM_CLOSE, 0, 0) ;
  282.     }
  283.      return  TRUE ;
  284. }
  285. void  CEnumWindowsDlg::OnBnClickedButtonRefrush()
  286. {
  287.      // TODO: 在此添加控件通知处理程序代码
  288.     m_ListWnds.DeleteAllItems();
  289.      if (m_ImgList.GetSafeHandle())
  290.     {
  291.         m_ImgList.DeleteImageList();
  292.     }
  293.     m_ImgList.Create(16,16,TRUE|ILC_COLOR24,4,1);
  294.     
  295.     m_bLoadIcon= true ;
  296.     EnumWindows((WNDENUMPROC)enumProc,( LPARAM ) this );
  297.     m_bLoadIcon= false ;
  298.     EnumWindows((WNDENUMPROC)enumProc,( LPARAM ) this );
  299.     m_ListWnds.SetImageList(&m_ImgList,LVSIL_SMALL);
  300. }

 获取任务管理器中的任务来源于 http://www.wangchao.net.cn/bbsdetail_901859.html

其它部分做了一些修改

 

 

 

#include <tlhelp32.h>
#pragma comment(lib,"kernel32.lib")

//枚举一个进程的模块信息
void EnumModule(DWORD dwPID=0)
{
    // 枚举Module: Take a snapshot of all modules in the specified process.
    HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
    if (hModuleSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 me32 = {0};
        me32.dwSize = sizeof(MODULEENTRY32);
        BOOL bResult = Module32First(hModuleSnap, &me32);
        while (bResult)
        {
            TRACE("%s/n" , me32.szExePath);
            bResult =  Module32Next(hModuleSnap, &me32);
        }
            
        // 关闭快照句柄
        CloseHandle (hModuleSnap);
    }   
}


//枚举进程void EnumProcess()
{
    // 枚举进程:
    HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hModuleSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 peProcess = {sizeof(PROCESSENTRY32)};
        BOOL bResult = Process32First(hModuleSnap, &peProcess);
        while (bResult)
        {
            // 在此就能获得所有进程
            TRACE("%s/n", peProcess.szExeFile);
            bResult = Process32Next(hModuleSnap, &peProcess);       
        }
        
        // 关闭快照句柄
        CloseHandle (hModuleSnap);
    }   
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值