进程管理器---一个SDK的例子

来源:互联网 发布:丸美白色之恋 知乎 编辑:程序博客网 时间:2024/05/16 16:19

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

请各位高手指点,谢谢!

下面是代码:

编译前在project setting ->link->object /library module中添加comctl32.lib Psapi.lib这两个库。

process.cpp:

#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;
 }
}

 


process.rc:

//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG DIALOG DISCARDABLE  0, 0, 213, 262
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 10, "宋体"
BEGIN
    DEFPUSHBUTTON   "刷新",IDREFRESH,17,230,39,14
    PUSHBUTTON      "结束进程",IDOK,89,228,39,14
    CONTROL         "List1",IDC_LISTVIEW,"SysListView32",LVS_REPORT |
                    WS_BORDER | WS_TABSTOP,17,9,176,212
    PUSHBUTTON      "退出",IDCANCEL,159,228,39,14
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
    IDD_DIALOG, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 206
        TOPMARGIN, 7
        BOTTOMMARGIN, 255
    END
END
#endif    // APSTUDIO_INVOKED


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h/0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
    "#include ""afxres.h""/r/n"
    "/0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
    "/r/n"
    "/0"
END

#endif    // APSTUDIO_INVOKED

#endif    // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////

 

#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

resource.h:

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Process.rc
//
#define IDD_DIALOG                      101
#define IDC_LISTVIEW                    1000
#define IDREFRESH                       1001

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1003
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif