要实现在我的程序中关闭用户运行的所有程序,琢磨了很长时间了,不得不问了 (300分)

  • 主题发起人 主题发起人 盛利
  • 开始时间 开始时间

盛利

Unregistered / Unconfirmed
GUEST, unregistred user!
美萍有这个功能,在上机时间到的时候,锁定机器,关闭用户打开的程序(游戏,qq,网页
什么的),但是还不关闭windows自己运行的比如电源管理等进程,我觉的这个很有意思,
但是想了很长时间都没有实现
有两个想法:一个是把windows自己运行的进程记下来,关闭的时候,把记下来的进程之外
的进程全杀死,但是不同的机器自己运行的进程也许不一样的,不好
还有个想法:在网上看到的,不知道怎么做,但是这个想法很好,在我的程序运行之后就做
个钩子,能钩到在我的程序运行之后运行的程序,那么记下来,在锁定机器的时候,把记下
来的进程全杀死

请大家看看哪个想法好,第一个想法如果给出windows一般的进程有那些,是做什么用的,
我给100分
第2个想法,高手能告诉我怎么实现,给点代码提示,200分奉送了,哈哈
当然,如果你的方法比上面两个方法都好,而且告诉我实现方法,300分就给你了!
不管问题能不能解决,看到这个问题的人,我先谢了,帮我踢一下
即使问题不能解决,我通过看书,找资料也学了不少东西,我一直会努力,终有一天会解决的!
 
>>但是不同的机器自己运行的进程也许不一样的,不好:
你可以在开始运行时或打开(取消锁定)时记录下当前运行的程序,
关闭的时候把记下来的进程之外的进程全杀死
 
好是地2个好,但是人家要在你的程序后运行了一个系统进程呢?
得到windows系统进程集的文章好像也很多,我想你只要把windows所有的进程都排除那么就好做了
我想的肯定不是很好可能也会有错,希望得到更多的学习:)
 
to 独帅:你的办法怎么实现啊,给电代码,好吗?
to rockjie:我想你只要把windows所有的进程都排除那么就好做了
我要是能分开,我也就不用那么费劲了!你能分开吗?
 
去看看 API函数大全,也许有相关函数。

听课。。。。
 
你的email呢,我可以告诉你实现的思路!
 
下面的函数可以得到当前正在运行的所有进程的ID(要在单元开始包含TlHelp32单元):
procedure TForm1.FindProcessIDs;
var
lppe: TProcessEntry32;
SsHandle: THandle;
FoundAProc: Boolean;
begin
lppe.dwSize := SizeOf(lppe);

ssHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
FoundAProc := Process32First(SsHandle, lppe);

while FoundAProc do
begin
//你可以将其保存在你自己的列表中
ListBox1.Items.Add(IntToStr(lppe.th32ProcessID));
FoundAProc := Process32Next(SsHandle , lppe);
end;
CloseHandle(SsHandle);
end;

然后在关闭的时候再调用一下这个函数,如果发现前面的列表中没有的进程,
那肯定是后来才创建的,把他们都关掉就可以了。
 
告诉你一个算法:
1.你的程序运行时得到所有现成的ID1.
2.需要关闭时再次得到所有现成的ID2.
3.用For循环把id2中的id1全部清为0.
for i:=1 to id1的个数 do
begin
for j:=1 to id2的个数 do
if (id1=id2[j]) and (id2[j]<>0) then
id2[j]:=0;
end;
4.把id2中id不为0的进程全部终止.
for j:=1 to id2的个数 do
if (id2[j]<>0) then
terminateprocess(
openprocess(id2[j],终止参数),
0)
5.每平就是这样做的!
 
想法不错!
问题很简单,代码比较长,……贴出来太多了!源代码现在不在手边(以前做过一个)
自己研究应该可以轻松搞定的
 
试试这个:不过是VC的,自己翻译一下
int app=BSM_APPLICATIONS;
unsigned long bsm_app=(unsigned long )app;
BroadcastSystemMessage(BSF_POSTMESSAGE,&bsm_app,
WM_CLOSE,NULL,NULL);
 
多人接受答案了。
 
后退
顶部