📄 processmanage.cpp
字号:
// 倪梓鹏
//------------------------------------------------------------------------------
//该程序是一个在win2000下用sdk写简单的系统进程管理器,
//由于进程路径,dll模块还有线程显示部分是后来补上的,所以跟前面部分用链表存储进程信息格格不入。
//再者由于本人水平太差,不懂得如何用<tlhelp32.h>获得进程路径以及dll模块,因
//而出现了既用<tlhelp32.h>,又用<psapi.h>奇怪的现象。
//该程序设计原先的设计思想是用链表存储有关于系统进程的一切要显示的信息,当杀死某进程时,对链表
//节点进行删除,并重新显示进程信息,以及用定时器定时扫描系统进程,如有新进程则插入新节点,以及
//允许用户导出进程信息文件.
//但当发现非个人能力所及,已是木已成舟,呜呼~~~~~~~~,奈何!!!
//所以最后链表存储的只有进程的基本信息,进程的线程,调用的dll也没有插入到链表中,也没有用到定
//时器,文件导出就更不用说啦!
//进程每调用一次showprocess就重新扫描系统进程,并添加节点,显示进程信息完毕后又清空链表(无奈!!!)
//每点击主listview(进程信息列表)的每一项,就可以获得该进程的id,从而显示该进程的有关dll以及线程。
//最后还有一点要注意的就是杀死进程前,我提升了进程的权限( KillProcess()中的函数UpdateProcessPrivilege)
//可以杀死系统的大把进程,死机或是系统崩溃可与我无关喔(重启可恢复),如果想要保持像任务管理器那样
//安全有限制的杀死进程,请把KillProcess()函数中包含UpdateProcessPrivilege(该函数的具体实现在
//"ProcessInformation.h"中)的那一行删除。经测试在win2k下,最多可删剩3个进程.
//把进程smss杀了,其他进程没显示的路径就可以显示出来。这是为什么我到现在还不清楚,那位高手告诉我阿,
//拜托!拜托!zpni@21nc.com
//-------------------------------------------------------------------------------
//整个程序主要包含两个文件"ProcessInformation.h"(链表实现文件)以及ProcessManage.cpp(
//功能实现文件)其他的就无关要紧,PSAPI.h,PSAPI.lib文件是库文件
//-------------------------------------------------------------------------------
#include <windows.h>
#include <tlhelp32.h>
#include "ProcessInformation.h"
#include "psapi.h"
#include <commctrl.h> //使用扩展的一些就要用这个头文件
#pragma comment(lib,"comctl32.lib")//编译时增加comctl32.lib,里面有扩展控件的接口
//--------------------- 控件值 ------------------------------------------------
#define IDKILL 1000
#define IDSTATIC1 1000
#define IDSTATIC2 1001
#define IDCLIST 3000
#define IDCDLLLIST 3001
#define IDCTHREADLIST 3002
//--------------------------------------------------------------------------------
#define iColMax 6 // listview的column的项目数
//---------------------------------------------------------------------------------
HINSTANCE hAppInstance = NULL; //实例(程序自身)句柄
HWND hListView = NULL,//控件ListView句柄
hThreadListView = NULL,
hDllListView = NULL,
hMainWindow = NULL,//主窗口句柄
hBtnOK = NULL,//按键"列举进程"句柄
hBtnKill = NULL,
hBtnExit = NULL;
static TCHAR szAppName[] = TEXT ("ListProcess") ; //程序名
TCHAR Buffer[256]; //缓冲区
//----------------------------------------------------------------------------------
BOOL AddItem(HWND hWndListView, int iItem,int iSubItem, LPSTR lpstr); //对控件ListView添加项目
BOOL InitListViewColumns(HWND hWndListView, int iCol, int iWidth, LPSTR lpstr) ;//初始化控件ListView表头
BOOL GetSelectItem(HWND hWhichListView, DWORD &dwProcessId);
//---------------------------------------------------------------------------------
BOOL ShowProcess(LinkList &head); //显示刷新进程列表
BOOL KillProcess(); //结束选中进程
//---------------------------------------------------------------------------------
BOOL ShowThreadList () ;
BOOL GetThreadInfo(DWORD dwProcessId);
BOOL ShowDll();
BOOL GetDllInfo(DWORD dwProcessId);
//---------------------------------------------------------------------------------
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//窗口过程函数
//-----------------------------------------------------------------------------------
//===================================================================================
//listview控件添加项目,iItem为纵向列数,iSubItem为横向列数,lpstr为显示内容
BOOL AddItem(HWND hWndListView, int iItem, int iSubItem, LPSTR lpstr)
{
if( 0 == iSubItem)
{
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lvi.stateMask = 0;
lvi.state = 0;
lvi.iItem = iItem;
lvi.iSubItem = iSubItem;
lvi.pszText = lpstr; // sends an LVN_GETDISPINFO
if( ListView_InsertItem(hWndListView,(LPARAM)&lvi) == -1)
return FALSE;
}
else if( 0 < iSubItem)
ListView_SetItemText(hWndListView, iItem, iSubItem ,lpstr);
return TRUE;
}
//初始化表头,iCol为横向列序数,iWidth为某列宽度,lpstr为显示内容
BOOL InitListViewColumns(HWND hWndListView, int iCol, int iWidth, LPSTR lpstr)
{
if ( iCol <= iColMax )
{
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
// Add the columns.
lvc.iSubItem = iCol;
lvc.pszText = lpstr;
lvc.cx = iWidth; // width of column in pixels
lvc.fmt = LVCFMT_LEFT; // left-aligned column
if (ListView_InsertColumn(hWndListView, iCol, &lvc) == -1)
return FALSE;
return TRUE;
}
else
return FALSE;
}
//hwichlistview 是listview 控件句柄,dwProcessId是选中某项后得到进程id
BOOL GetSelectItem(HWND hWhichListView,DWORD &dwProcessId)
{
int ipos;//ipos返回选中项的索引
ipos = ListView_GetNextItem(hWhichListView, -1, LVIS_SELECTED);
if( -1 == ipos)
{
dwProcessId = 0;
return FALSE;
}
ListView_GetItemText(hWhichListView,ipos,0,Buffer,10);
dwProcessId = atol(Buffer);
return TRUE;
}
//----------------------------------------------------------------------------------
//以上部分是有关对控件listview的操作
//-----------------------------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MSG msg ;
WNDCLASS wndclass ;
InitCommonControls();
hAppInstance = hInstance;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hMainWindow = CreateWindow(
szAppName,
"系统进程管理器",
WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
650,460,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow (hMainWindow, iCmdShow) ;
UpdateWindow (hMainWindow) ;
while (GetMessage (&msg, NULL, 0, 0))
{
if (!IsWindow(hMainWindow) || !IsDialogMessage(hMainWindow, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LinkList L,Head;
Head = InitList(L);//创建存储进程信息的链表,返回头节点
switch (message)
{
case WM_CREATE:
//创建ListView列表框
hListView = CreateWindow("SysListView32" , NULL,WS_BORDER | WS_CHILD | WS_VISIBLE
| WS_TABSTOP | WS_VSCROLL| LVS_REPORT| LVS_SHOWSELALWAYS,
20, 20, 510, 205, hwnd, (HMENU)IDCLIST,
hAppInstance, NULL);
hDllListView = CreateWindow("SysListView32" , NULL,WS_BORDER | WS_CHILD | WS_VISIBLE
| WS_TABSTOP | WS_VSCROLL| LVS_REPORT|LVS_SHOWSELALWAYS,
20, 250, 280, 150, hwnd, (HMENU)IDCDLLLIST,
hAppInstance, NULL);
hThreadListView = CreateWindow("SysListView32", NULL,WS_BORDER | WS_CHILD | WS_VISIBLE
| WS_TABSTOP | WS_VSCROLL| LVS_REPORT|LVS_SHOWSELALWAYS|LVS_NOLABELWRAP ,
300, 250, 220, 150, hwnd, (HMENU)IDCTHREADLIST,
hAppInstance, NULL);
hBtnOK=CreateWindow("BUTTON", //建立按钮"列举进程"
"列举进程",
WS_CHILD | WS_VISIBLE,
550,30,
70,30,
hwnd,
(HMENU) IDOK,
hAppInstance,
NULL);
hBtnKill=CreateWindow("BUTTON", //建立按钮"杀死进程"
"杀死进程",
WS_CHILD | WS_VISIBLE,
550,80,
70,30,
hwnd,
(HMENU) IDKILL,
hAppInstance,
NULL);
hBtnExit =CreateWindow("BUTTON", //建立按钮"退出"
"退出",
WS_CHILD | WS_VISIBLE,
550,130,
70,30,
hwnd,
(HMENU) IDCANCEL,
hAppInstance,
NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -