如何得到进程名并终止之(100分)

  • 主题发起人 主题发起人 fu_xiang_yu
  • 开始时间 开始时间
F

fu_xiang_yu

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何编程查看当前系统尽可能多的前后台进程名
比如winamp,...等等

如果只知道这些进程名,不知道它们的类名和窗口名
如何编程终止(关闭)它们
比如上述的winamp?
 
给你发一个例子,你看看吧!

Good luck!
 
发到fu_xiang_yu@163.net里了
 
下面是我写的一段源代码,只要你把你想要终止的程序名(包括路径)写入
D:/Program Files/text1.txt这个文件中(注意每行写一个程序名).那么这个
程序无法运行下去.程序里有详细的注释.祝你好运!
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,tlhelp32,stdCtrls, ExtCtrls;//注意加上tlhelp32这个单元;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Timer1: TTimer;
ListBox2: TListBox;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
procedure processlist(var prolist:tlist);//自定义函数列举所有的进程;
procedure exitcode //自定义函数终止进程;
{ Private declarations }
public
{ Public declarations }
end;
type tproinfo=record
filename:string;
proid:dword;
end;proinfo=^tproinfo;//自定义记录用来记录进程的文件名和ID;

var
Form1: TForm1;
curr:tlist;
temp,b,a1:integer;
implementation

{$R *.DFM}


procedure TForm1.processlist(var prolist: tlist);
var p:proinfo;
ok:bool;
prolisthandle:thandle;
prostruct:tprocessentry32; //记录进程的数据结构;
begin
prolist:=tlist.Create
prolist.Clear
prolisthandle:=createtoolhelp32snapshot(th32cs_snapprocess,0);
prostruct.dwSize :=sizeof(prostruct);
ok:=process32first(prolisthandle,prostruct);//发现第一个进程;
while integer(ok)<>0 do
begin
new(p);
p.filename :=prostruct.szExeFile
p.proid :=prostruct.th32ProcessID
prolist.Add (p);
ok:=process32next(prolisthandle,prostruct);//发现下一个进程;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
a:string;
f:textfile;
begin
listbox1.Clear;
listbox2.Clear;
if fileexists('D:/Program Files/text1.txt') then
begin //该文件记录你所想禁止运行的程序的路径;
assignfile(f,'D:/Program Files/text1.txt');
reset(f);
while not eof(f) do
begin
readln(f,a);
a:=uppercase(a); //转化成大写字母;
listbox2.Items.Add (a); //记录所有被禁止运行程序的路径;
end;
closefile(f)
end
else application.Terminate

end;


procedure Tform1.exitcode;
var h:thandle;
a:dword;
p:proinfo;

begin
begin
p:=curr.items; //指向禁止运行的进程的数据结构;
h:=openprocess(process_all_access,true,p.proid);
getexitcodeprocess(h,a); //得到进程退出代码;
terminateprocess(h,a) //终止进程
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
p:proinfo;
begin
listbox1.Clear
processlist(curr); //调用进程列举的函数;
for i:=0 to curr.Count-1 do
begin
new(p);
p:=curr.Items;
listbox1.Items.Add(p.filename); //记录所有的进程的路径;
end; //listbox2是记录所有禁止运行的程序的路径;
for i:=0 to listbox2.Items.Count-1 do
if (listbox1.Items.IndexOf(listbox2.Items.Strings)>=0) then
begin
b:=listbox1.Items.IndexOf(listbox2.Items.Strings);
exitcode;//调用终止进程的函数;
end;
end;
end.
 
哇,你们两人的东东都不错
 
;那怎么还不加分?
 
to leebons:别急嘛,我再研究一下
 
该结束了!
 
放心吧,你们俩都有分,而且总和为100
 
win98 跟winnt下的方法是不一样的。
leebons的方法适合于win98
 
那nt下该怎么办

hnzgf:你给我的源码适用于nt吗
 
我这是win2000,应该可以
 
2000是基于NT的,所以你可以试试!
 
终于看完了hnzgf的东东,不错,真不错
看得我直流口水
leebons的也可以,就是太简单了些

给分了,给分了~~~~~~~~~(还在回想hnzgf的代码,并不停的做擦汗状)
 
多人接受答案了。
 
后退
顶部