您的位置:首页 > 编程语言 > Delphi

delphi进程监测

2013-10-21 16:47 197 查看
自制力实在是太弱了,回想了一下这周的进度,真是惨不忍睹,本来计划要看的书一点都没看,每天写代码的时间都没几分钟,时间全花到上网跟聊qq上了,就有个想法,做一个进程管理的小程序,自动检测浏览器和qq,发现就关闭掉。

主要使用了windows中的OpenProcess和TerminateProcess函数。

第一步:检测进程是否存在(获取到任务管理器中的进程列表,循环比较跟要寻找的进程名称是否一致)

function TProcessManage.CheckProcess(ProcessName: string;out ProcessID:DWORD): Boolean;
var
aps:array[1..1024] of DWORD;
hProcess, cb:cardinal;
procCnt, hModule:DWORD;
i:integer;
ret:LongBool;
moduleFileName:array[1..100] of ansichar;
begin
Result := False;
EnumProcesses( @aps, sizeof( aps ), cb );
procCnt := cb div sizeof( DWORD );
for i:=1 to procCnt do
begin
hProcess := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, aps[i] );
if hProcess = 0 then continue;
ret := EnumProcessModules( hProcess, @hModule, sizeof(hModule), cb );
if not ret then continue;
GetModuleBaseName( hProcess, hModule, @moduleFileName, sizeof( moduleFileName ) );
if lstrcmpi( @moduleFileName, PAnsiChar(ProcessName)) = 0 then
begin
//MessageBox( 0, '已经运行', 'xxx', MB_OK );
ProcessID := aps[i];
Result := True;
end;
end;
end;


 

第二步:强制结束进程,这个就简单了,这里需要注意的是,关闭进程需要权限,使用

PROCESS_TERMINATE的方式打开进程,然后执行关闭。

function TProcessManage.KillProcess(ProcessName: string;out Errstr:string): Boolean;
var
processid:DWORD;
hProcess:cardinal;
begin
try
if CheckProcess(ProcessName,processid) then
begin
hProcess := OpenProcess( PROCESS_TERMINATE, false, processid );
TerminateProcess(hProcess,0);
Result := True;
end
else
begin
Errstr := '没有找到这个进程';
Result := False;
end;
except
Errstr := SysErrorMessage(GetLastError());
Result := False;
end;
end;


界面是直接用的定时器来检测进程是否存在,其实用钩子检测应用程序的启动更合理,但是试了下钩子,有些东西不会用,直接电脑就卡死了,现在先这么简单处理吧,o(╯□╰)o,实测可用。

后续再维护。。。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: