中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
进程管理器---一个SDK的例子
作者:未知 时间:2004-07-13 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无

我刚学习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;
 }
}

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有