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