我刚学习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; }}
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>