欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
进程管理器---一个SDK的例子
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 

我刚学习SDK编程,想编一个SDK编的进程管理器,可是网上都没有,只好自己写了。不足之处,

请各位高手指点,谢谢!

下面是代码:


#include <windows.h>
#include <commdlg.h>
#include <commctrl.h>
#include "resource.h"
#include <Tlhelp32.h>
#include <stdio.h>
#include "psapi.h"
BOOL Init( HWND );
void    RefreshProcess(HWND );
BOOL    EndProcess(HWND);
LRESULT CALLBACK  Test(HWND , UINT , WPARAM , LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
 InitCommonControls();

 DialogBox(NULL , (LPCTSTR)IDD_DIALOG , NULL ,(DLGPROC)Test);

 return 1;
}

LRESULT CALLBACK  Test(HWND hDlg , UINT message , WPARAM wParam , LPARAM lParam)

 
 switch(message)
  {
  case WM_INITDIALOG:
       Init(hDlg);            
       return TRUE;
  case WM_COMMAND:
   switch(LOWORD(wParam))
   {case IDCANCEL:
    EndDialog(hDlg,0);
    KillTimer(hDlg,1000);
    return TRUE;
    break;
    case IDOK:
    return(EndProcess(hDlg));
    break;
    case  IDREFRESH:
    RefreshProcess(hDlg);
    return TRUE;
    break;

 

   }
 
 
  }
 return FALSE;
}

/************************************************************************/
/*  刷新进程        入口参数 对话框句柄          */      
/*                                                                     */
/************************************************************************/

 

void   RefreshProcess(HWND hDlg)

 HANDLE  hSnapshot,h_Process;
 PROCESSENTRY32 pe;
 char  lpszAdd[255];
 int  nIndex;
 DWORD  Memory;
 LVITEM  Lv;
 PROCESS_MEMORY_COUNTERS  PMC;
 pe.dwSize = sizeof(pe);
 hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 Process32First( hSnapshot, &pe);
 sprintf(lpszAdd,"%s",pe.szExeFile);
 Lv.mask         = LVIF_TEXT;
 Lv.iItem        = 0;
 Lv.iSubItem     = 0;
 Lv.pszText = lpszAdd; 
 SendDlgItemMessage(hDlg , IDC_LISTVIEW , LVM_DELETEALLITEMS, 0 , 0);
 SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_INSERTITEM , 0,  (LPARAM)&Lv);
 sprintf(lpszAdd,"%i",pe.th32ProcessID);
 Lv.iSubItem = 1;
 SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_SETITEM , 0, (LPARAM)&Lv);
 sprintf(lpszAdd,"%i",pe.pcPriClassBase);
 Lv.iSubItem = 2;
 SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_SETITEM , 0, (LPARAM)&Lv);
 //system process 的内存始终是20K
 Memory = 20;
 sprintf(lpszAdd,"%2i K",Memory);
 Lv.iSubItem = 3;
 SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_SETITEM , 0, (LPARAM)&Lv);
 while( Process32Next(hSnapshot, &pe))
  {
  sprintf(lpszAdd,"%s",pe.szExeFile);
  Lv.iSubItem = 0;
  nIndex = SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_INSERTITEM , 0,
         (LPARAM) &Lv);
  if( nIndex != -1)
   {
   
   Lv.iItem    = nIndex;
   Lv.iSubItem = 1;
   sprintf(lpszAdd,"%i",pe.th32ProcessID);
   SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_SETITEM , 0,
                     (LPARAM)&Lv);
   Lv.iSubItem = 2;
   sprintf(lpszAdd,"%i",pe.pcPriClassBase);
   SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_SETITEM , 0,
                     (LPARAM)&Lv);
   h_Process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ , FALSE , pe.th32ProcessID);
   //得到进程内存大小
   GetProcessMemoryInfo(h_Process , &PMC , sizeof(PMC));
   Memory = PMC.WorkingSetSize/1024;
   sprintf(lpszAdd,"%i K",Memory);
   Lv.iSubItem = 3;
   SendDlgItemMessage(hDlg, IDC_LISTVIEW, LVM_SETITEM , 0, (LPARAM)&Lv);
  
   }
  }
 
}

/*
/************************************************************************/
/*                  初始化函数,主要用来添加列表控件的列头              */
/************************************************************************/

 


BOOL   Init(HWND hDlg)
{
 LVCOLUMN lv;
 static char     *szText[]={"映像名称","PID","优先级","内存使用"};
 static int cx[]={100,100,80,120};
 int i = 0;
 for(i=0 ; i< 4 ;i++)
 {
 lv.mask       =  LVCF_TEXT|LVCF_WIDTH;
 if(i<2)
 lv.fmt       =  LVCFMT_LEFT;
 else
 lv.fmt       =  LVCFMT_RIGHT;
 lv.cx         =  cx[i];
 lv.pszText    =  szText[i];
 SendDlgItemMessage(hDlg,IDC_LISTVIEW,LVM_INSERTCOLUMN,(WPARAM)i,(LPARAM)&lv);
 }
 SendDlgItemMessage(hDlg,IDC_LISTVIEW , LVM_SETEXTENDEDLISTVIEWSTYLE , (WPARAM)LVS_EX_FULLROWSELECT,(LPARAM)LVS_EX_FULLROWSELECT);
 RefreshProcess(hDlg);
 return TRUE;
}

 

/************************************************************************/
/* 结束进程函数 ,用来结束列表视图中选定的进程                          */
/************************************************************************/

BOOL    EndProcess(HWND hDlg)

 int  hProcess  = SendDlgItemMessage(hDlg, IDC_LISTVIEW , LVM_GETNEXTITEM , -1, (LPARAM)MAKELPARAM((UINT)LVNI_SELECTED, 0));
 if (hProcess != -1)
 { 
  LVITEM          Lv;
  char          Buffer[256];
  HANDLE          h_process;
  DWORD          ProcessId;
  BOOL   iRet;
  memset(Buffer,0,sizeof(Buffer));
  Lv.iSubItem = 1; 
  Lv.pszText = Buffer;
  Lv.cchTextMax = sizeof(Buffer);
  SendDlgItemMessage(hDlg , IDC_LISTVIEW , LVM_GETITEMTEXT , (WPARAM)hProcess , (LPARAM)&Lv);
         ProcessId      = atol(Buffer);
  h_process      = OpenProcess(PROCESS_TERMINATE , NULL , ProcessId);
  if (h_process == NULL)
  {MessageBox(hDlg , "进程无法访问","错误",MB_OK);
   return FALSE;
  }
  else
  {
    if(MessageBox(hDlg ,"结束这个进程吗?","警告",MB_OKCANCEL)==IDOK)
    { iRet = TerminateProcess(h_process,0);
       if (!iRet)
        {MessageBox(hDlg,"结束进程失败","错误",MB_OK);
         return TRUE;
       }
       else
       {MessageBox(hDlg,"结束进程成功","成功",MB_OK);
       return FALSE;
       }
    
   }
    else
     return FALSE;

  }
  
  
 }
 else
 {return   FALSE;
 }
}


附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步