其实对于 windows进程的操作很简单,只要理解了 进程线程的概念 对于 进程的操作 那么就只是 几个函数的 问题了 。
下面是 对于进程操作要用到的几个函数 。
进程的概念:我们运行了一个程序,那个这个独立的程序就是一个进程。进程有自己的私有地址空间,进程中的线程共享这些私有地址空间 。
在一个进程中多个线程共同完成一项功能,可以提高工作的效率。
HANDLE WINAPI CreateToolhelp32Snapshot( //这个函数创建一个系统进程列表的快照 并返快照的句柄 用于操作
DWORD dwFlags,
DWORD th32ProcessID
);
BOOL WINAPI Process32First( //根据进程快照句柄检索快照列表中 第一个进程
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL WINAPI Process32Next( //根据进程快照句柄 循环检索进程信息 。。
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
HANDLE OpenProcess( //给定一个进程ID 我们可以打开并且获取句柄 用于 ReadProcessMemory WriteProcessMemory 等等的线程插入使用
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process identifier
);
BOOL TerminateProcess( //根据指定进程句柄关闭进程
HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
typedef struct tagPROCESSENTRY32 { //进程信息结构体 用于接收进程的各种信息
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;
BOOL ExitWindowsEx(
UINT uFlags, // shutdown operation
DWORD dwReason // shutdown reason
);
第一个参数的取值
Value | Meaning |
---|---|
EWX_LOGOFF | 注销 |
EWX_POWEROFF | 断电. |
EWX_REBOOT | 重启. |
EWX_SHUTDOWN |
下面是一段例子代码 在SDI下测试运行 在视图类中定义一个 CListCtrl类的对象c
然后定义一个 进程信息类
class ProcessInfo
{
public:
ProcessInfo(){index=0 ;}
int index ;
DWORD hArray[100] ;
};
这些都放在视图的操作中 ,如果这些做完了 那么就相应copy下面的代码
void CMyView::OnInitialUpdate() //视图初始化.....
{
CView::OnInitialUpdate();
GetDocument()->SetTitle("系统进程查看器--MadeBy小卫") ;
InitProcessist() ;
}
void CMyView::OnKiilprocess() //查杀进程
{
POSITION ps=c.GetFirstSelectedItemPosition();
if (ps==NULL)
{
exit(0) ;
}
int item=c.GetNextSelectedItem(ps) ;
HANDLE pt=OpenProcess(PROCESS_ALL_ACCESS,FALSE,f.hArray[item]) ; //打开进程
TerminateProcess(pt,0) ; //查杀进程
InitProcessist();//初始化列表
}
void CMyView::InitProcessist()
{
int index=0 ;
CString in ;
if(c.m_hWnd==NULL)
{
c.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_SINGLESEL ,CRect(0,0,600,500), this, 1);
c.InsertColumn(0,"进程地址",LVCFMT_LEFT,350) ;
c.InsertColumn(0,"进程ID",LVCFMT_LEFT,250) ;
c.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE) ;
}
else
{
c.DeleteAllItems() ;
ZeroMemory(&f,sizeof(f)) ;
}
HANDLE sh=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ;//返回包含进程列表的
PROCESSENTRY32 pinfo; //进程信息结构体
BOOL check=Process32First(sh,&pinfo) ; //检索进程快照列表中的第一个 进程
if (check)
{
in.Format("%d",pinfo.th32ParentProcessID) ; //格式换文本
c.InsertItem(index,in) ;
c.SetItemText(index,1,pinfo.szExeFile) ; //设置子项文本
f.hArray[f.index]=pinfo.th32ProcessID ;//保存进程ID
f.index++;
index++ ;
}
while(Process32Next(sh,&pinfo)) //如果快照列表存在 那么继续搜索
{
in.Format("%d",pinfo.th32ParentProcessID) ;
c.InsertItem(index,in) ;
c.SetItemText(index,1,pinfo.szExeFile) ;
f.hArray[f.index]=pinfo.th32ProcessID ;//保存进程ID
f.index++;
index++ ;
}
}