易语言里检测进程,易语言检最直接的测进程路子是调用系统API。别绕弯子,易语言检就用进程_是测进程否存在()?那是模块封装好的,内部还是易语言检走API。真要看底层,测进程核心就两个函数:CreateToolhelp32Snapshot和Process32FirstW/Process32NextW。易语言检
拿个实际例子说。测进程你要检测“qq.exe”是易语言检否在跑,先拍快照——CreateToolhelp32Snapshot(2,测进程 0),参数2是易语言检进程快照类型,0表示所有进程。测进程这函数返回一个句柄,易语言检就像相机快门按下,测进程把当前系统进程列表凝固住。易语言检
接下来遍历。用Process32FirstW拿到第一个进程,存进PROCESSENTRY32W结构体。这个结构体里有个szExeFile字段,存着进程名。循环对比,不是目标就调Process32NextW拿下一个。直到返回0,说明找完了。
代码长这样:
快照句柄 = CreateToolhelp32Snapshot (2, 0) 如果真 (快照句柄 = -1) 返回 假 结构体.szExeFile = 取空白字节集 (260) 结构体.dwSize = 结构体大小 如果真 (Process32FirstW (快照句柄, 结构体)) 循环判断首 () 如果真 (到文本 (结构体.szExeFile) = 目标进程名) 关闭句柄 (快照句柄) 返回 真 如果真结束 如果真 (Process32NextW (快照句柄, 结构体) = 0) 跳出循环 如果真结束 循环判断尾 () 关闭句柄 (快照句柄) 返回 假 有个坑得提醒。进程名带不带路径?szExeFile只返回文件名,比如“notepad.exe”,不含路径。要是同名进程开多个,这方法只能告诉你“存在”,分不清哪个是哪个。要精确到PID,得额外比较th32ProcessID字段。
另外权限问题。检测别人进程没事,但要是目标进程被保护(比如某些安全软件),快照能拍到,但读取进程信息可能被拒绝。这时候返回的句柄可能有效,但Process32FirstW会失败。别问怎么绕过,那是越权的事,正经用途用不上。
易语言里写这个,别忘了在DLL声明里加上CreateToolhelp32Snapshot来自kernel32.dll,结构体定义也要对。PROCESSENTRY32W的dwSize必须初始化成结构体字节数,不然API不认。我见过有人漏了这步,结果遍历永远返回第一个进程,排查半天。
要是嫌手动写麻烦,精益模块里进程_是否存在就是封装好的,传个进程名进去返回真假。但封装层有额外开销,循环几百次性能差距就出来了。高频检测(比如1秒查一次)建议直接调API,省得模块内部反复建快照。
最后提个思路。检测进程这事,本质是“枚举+匹配”。换个角度,用EnumProcesses拿PID数组,再配合OpenProcess+QueryFullProcessImageName拿路径,能绕开快照的某些限制。但复杂些,适合需要进程完整路径的场景。简单检测,快照法够用。