📄 processmanage.cpp
字号:
//为控件listview添加表头
//---------------------------------------------------------------------
InitListViewColumns(hListView, 0, 50, "ID");
InitListViewColumns(hListView, 1, 100, "进程映像名");
InitListViewColumns(hListView, 2, 60, "父进程ID");
InitListViewColumns(hListView, 3, 50, "线程数");
InitListViewColumns(hListView, 4, 50, "优先级");
// InitListViewColumns(hListView, 5, 180 , "模块ID");
InitListViewColumns(hListView, 5, 180 , "路径");
//---------------------------------------------------------------------
InitListViewColumns(hDllListView, 0, 180, " 模块信息 ");
InitListViewColumns(hDllListView, 1, 80, " 基地址");
//----------------------------------------------------------------------
InitListViewColumns(hThreadListView, 0, 60, "序号");
InitListViewColumns(hThreadListView, 1, 50, "线程ID");
InitListViewColumns(hThreadListView, 2, 55, "优先级");
//----------------------------------------------------------------------
ListView_SetExtendedListViewStyle(hListView,LVS_EX_FULLROWSELECT);
ListView_SetExtendedListViewStyle(hDllListView,LVS_EX_FULLROWSELECT);
ListView_SetExtendedListViewStyle(hThreadListView,LVS_EX_FULLROWSELECT);
ShowProcess(Head);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
ShowProcess(Head);
break;
case IDKILL:
if( IDYES == MessageBox(hMainWindow, "确认删除该进程", "ListProcess", MB_YESNO))
{
KillProcess();
ShowProcess(Head);
}
break;
case IDCANCEL:
DelList(Head);//彻底解除链表
DestroyWindow(hwnd);
break;
}//end switch
break;
case WM_NOTIFY:
switch( ((LPNMHDR) lParam)->code)
{
case NM_CLICK:
ShowThreadList();
ShowDll();
break;
}
break;
case WM_DESTROY:
DelList(Head);//彻底解除链表
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
//----------------------------------------------------------------------------
//以下部分是功能的具体实现
//-----------------------------------------------------------------------------
//显示进程信息
//参数head是系统所有的进程组成的链表(见文件"ProcessInformation.h")的头指针
BOOL ShowProcess(LinkList &head)
{
int i = 0;
LinkList L;
ListView_DeleteAllItems(hListView); //清空列表
EnumProcessesInfo(L,head);
//由提供的链条头节点,构造进程信息(id,父进程,名字,优先级,路径)链表,该函数在
//"ProcessInformation.h"中,链表的实现也在该头文件中
L = head->next ;
ListView_DeleteAllItems(hListView); //清空主列表
ListView_DeleteAllItems(hThreadListView); //清空线程列表
ListView_DeleteAllItems(hDllListView); //清空dll模块列表
while( NULL != L)
{
ltoa(L->dwProcessId, Buffer, 10);
AddItem(hListView, i, 0 ,Buffer);//添加进程id
AddItem(hListView, i, 1, L->szProcessName); //进程名
ltoa(L->dwParentProcessID, Buffer, 10);
AddItem(hListView, i, 2,Buffer ); //进程的父进程id
ltoa(L->dwCountOFThread, Buffer, 10);
AddItem(hListView, i, 3,Buffer ); // 线程数
ltoa(L->lPRIProcess, Buffer, 10);
AddItem(hListView, i, 4, Buffer );//进程的优先级
AddItem(hListView, i, 5, Buffer);
AddItem(hListView, i, 5, L->szPrcessPatch);//进程路径
i++;
L = L->next;
}
CleanList(head);
return TRUE;
}
//-------------------------------------
//杀死进程
BOOL KillProcess()
{
DWORD dwProcessId;
HANDLE hProcessHandle = NULL;
int success = 1;
if( GetSelectItem(hListView,dwProcessId))//获得要杀死的进程的ID保存在dwProcessId中
{
UpdateProcessPrivilege( GetCurrentProcess(), SE_DEBUG_NAME );
//危险动作,提高进程到特权模式,可以杀死很多运行在内核模式下的进程,该函数在"ProcessInformation.h"中
hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);
if (hProcessHandle != NULL)
{
success =TerminateProcess(hProcessHandle, 0); //结束选中进程,若成功返回0
Sleep(500);
return TRUE;
}
}
if( 1== success)
MessageBox(hMainWindow,"不能结束该进程" ,"ListProcess",16);
CloseHandle(hProcessHandle);
return FALSE;
}
//======================================================
//显示选中的进程的线程情况
BOOL ShowThreadList ()
{
DWORD dwProcessId;
if(GetSelectItem(hListView, dwProcessId))//获得选中的进程的ID保存在dwProcessId中
GetThreadInfo(dwProcessId);
else FALSE;
return TRUE;
}
//由某进程dwProcessId获得该进程的线程的具体情况
BOOL GetThreadInfo(DWORD dwProcessId)
{
HANDLE hThreadSnap = NULL;
BOOL bRet = FALSE;
THREADENTRY32 te32 = {0};
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
return (FALSE);
te32.dwSize = sizeof(THREADENTRY32);
int i = 0 ;
if (Thread32First(hThreadSnap, &te32))
{
ListView_DeleteAllItems(hThreadListView); //清空列表
do
{
if (te32.th32OwnerProcessID == dwProcessId)
{
itoa (i, Buffer,10);
AddItem(hThreadListView, i, 0, Buffer );
ltoa(te32.th32ThreadID,Buffer,10);
AddItem(hThreadListView, i, 1,Buffer );
ltoa(te32.tpBasePri,Buffer,10);
AddItem(hThreadListView, i, 2, Buffer );
i++;
}
}
while (Thread32Next(hThreadSnap, &te32));
bRet = TRUE;
}
else
bRet = FALSE;
CloseHandle (hThreadSnap);
return (bRet);
}
//===================================================================
//显示选中进程调用的Dll的具体情况
BOOL ShowDll()
{
DWORD dwProcessId = 0;
DWORD dwModuleId = 0;
DWORD cbMe32 = 0;
if(GetSelectItem(hListView, dwProcessId))
{
GetDllInfo(dwProcessId);
return TRUE;
}
return FALSE;
}
//由某进程dwProcessId获得该进程调用的dll
BOOL GetDllInfo (DWORD dwPID)
{
HMODULE hMods[1024];
HANDLE hProcess;
DWORD cbNeeded;
unsigned int i;
char szModName[MAX_PATH];
ListView_DeleteAllItems(hDllListView); //清空列表
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, dwPID);
if( hProcess && EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
{
for ( i = 0; i <=(cbNeeded / sizeof(HMODULE)); i++ )
{
if ( GetModuleFileNameEx( hProcess, hMods[i], szModName,
sizeof(szModName)))
{
AddItem(hDllListView, i,0, szModName);
wsprintf(Buffer,"0x%08x",hMods[i]);
AddItem(hDllListView, i,1, Buffer);
if( 0 == i)
{
AddItem(hDllListView, ++i, 0, "=====================");
AddItem(hDllListView, i, 1, "========");
}
}
}
CloseHandle( hProcess );
return TRUE;
}
else
{
CloseHandle( hProcess );
return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -