获取运行中的句柄
1.从窗口句柄中获取进程句柄
要对进程进行某种操作,就必须首先知道该进程的句柄或者进程ID
对于自己创建的子进程来说CreateProcess函数返回了子进程句柄和进程的ID
但是如果如果要对系统中运行的某个进程进行操作,那么首先获取他们的句柄才行
如果知道某个进程的ID
那么可以通过GetWindowThreadProcessID hWnd,lpdwProcessID
该函数可以从一个窗口句柄中获取创建该窗口的进程的进程ID
hWnd指明一个窗口句柄--可以通过FIndWindow来获得这个窗口句柄
lpdwProcessID指向一个双字节的变量,函数在这里返回创建窗口进程的ID
函数的返回值是目标进程中创建该窗口的线程的线程ID
得到进程ID后,就可以通过OpenProcess函数来获取该进程的句柄了
OpenProcess dwDesiredAccess,bInheritHandle,dwProcessID
dwDesireAccess 指定需要对该进程进行的操作,要对目标进程进行某种操作
一般来说,除了系统进程以外,可以对其他函数进行任何操作,操作码可以取以下取值的组合
PROCESS_ALL_ACCESS 等于下面全部操作的组合
PROCESS_CREATE_THREAD 允许创建远程线程
PROCESS_DUP_HANDLE 允许进程句柄被复制
PROCESS_QUERY_INFORMATION 允许使用GetExitCodeProcess查询进程退出码和使用GetPriorityClass函数查询进程的优先级
PROCESS_SET_INFORMATION 允许使用SetPriorityClass函数设置进程优先级
PROCESS_VM_OPERATION 允许使用WriteProcessMemory 和 VirtualProtectEx函数修改进程的地址空间
PROCESS_VM_READ 允许对进程空间进行读操作
PROCESS_WRITE 允许对进程地址空间进行写操作
bInheritHandle 指明返回的进程句柄是否可以被当前进程的子进程继承,如果参数指定为TRUE,则进程句柄可以被继承
dwProcessID指明目标进程的ID
如果函数成功执行,返回的是被打开的进程句柄,如果函数执行失败则返回NULL.一般打开失败的原因是由于权限不够引起的,当完成对目标进程的操作之后,必须使用CloseHandle将获得的句柄关闭
2.从快照函数获取进程句柄
(1)
使用GetWindowThreadProcessID获取进程的先决条件是必须创建了窗口,对于在后台运行的没有窗口的进程该如何处理呢?
这就可以通过枚举系统中运行的进程来解决了,这个功能可以由CreateToolHelp32Snapshot函数来实现
CreateToolHelp32Snapshot dwFlags,th32ProcessID
dwFlags 用来指定快照中需要返回的对象,本函数不仅可以获取进程列表,也可以用来获取线程和模块等对象的列表,参数可以指定的值是:
TH32CS_SNAPHEAPLIST 对指定进程中的堆进行枚举
TH32CS_SNAPMODULE 对指定进程中的模块进行枚举
TH32CS_SNAPPROCESS 对系统范围中的进程进行枚举
TH32CS_SNAPTHREAD 对系统范围中的线程进行枚举
th32ProcessID参数用来指定一个进程ID 对于TH32CS_SNAPPROCESS 和TH32CS_SNAPTHREAD这个参数可以为0
因为后2者是对系统范围内的枚举
如果函数执行成功返回一个快照句柄,否则返回-1
(2)从快照句柄中获取进程参数使用Process32First和Process32Next函数
Process32Next函数循环获取快照句柄中的进程信息,当不在有剩余信息时,函数返回FALSE
Process32First和Process32Next的第一参数指向一个快照句柄,第2个参数指向一个PROCESSENTRY32结构
Process32Next hSnapshot,lpProcessEntry32
结构定义如下
<span style="font-family:Microsoft YaHei;font-size:13px;">typedef struct tagPROCESSENTRY32
{
DWORD dwSize; 结构的长度
DWORD cntUsage; 进程的引用计数
DWORD th32ProcessID; 进程ID
ULONG_PTR th32DefaultHeapID; 进程默认堆的ID
DWORD th32ModuleID; 进程模块的ID
DWORD cntThreads; 被进程创建的线程数
DWORD th32ParentProcessID; 进程的父进程ID
LONG pcPriClassBase; 被进程创建的线程的基本优先级
DWORD dwFlags; 内部使用
TCHAR szExeFile[MAX_PATH]; 进程对应的可执行文件名称
} PROCESSENTRY32,
*PPROCESSENTRY32;</span>
在返回所有进程信息之后,需要使用CloseHandle将快照句柄关闭
在结构体中返回的进程ID(th32ProcessID)和可执行的文件名(szExeFile)是我们最关心的
这样我们就可以通过OpenProcess来对进程进行各种操作了
另外在ListBox能够为每一项自定义一个32位的自定义数据
LB_SETITEMDATA 和 LB_GETITEMDATA可以设置和获取自定义数据
正好可以把th32ProcessID设置进去......