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