紧急:请各位兄弟帮帮忙,请教如何在我的程序中终止其他程序的运行?????

thickhead_cat 2002-01-03 12:15:53
...全文
64 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiubolecn 2002-01-03
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
begin
killtask(edit1.text);
end;


edit1.text的内容就是你要关闭的程序的名字
thickhead_cat 2002-01-03
  • 打赏
  • 举报
回复
二位的回答确实很好

我想把这个问题再深入的讨论一下:如果我要关闭的程序自己处理了关闭的消息,我该怎样才能强行关闭它呢?
pdsinfo 2002-01-03
  • 打赏
  • 举报
回复
一般情况下楼上那位的方法是牛刀杀鸡了...
:P
如何在自己的系统中打开并关闭外部程序如何在自己的系统中打开并关闭外部程序

一、如何打开一个外部程序:
我们常用的函数有两个,WinExec(),ShellExecute(),因为ShellExecute()函数主要用于
Win32下,功能也强大一些,故而本文只对后者进行讨论。

首先,我们粗略地研究一下ShellExecute()的几个参数:
hwnd:窗体的句柄;
lpOperation:打开程序执行的操作,共预留有“open”、“explore”、“print”三种方式,此
参数可以省略,此时将依据打开的文件(lpFile)的类型执行相应的操作,比如:如果lpFile为一文本
文件,那么将会在与该文件相关联的程序中打开它;
lpFile:文件名;
lpParamerters:打开文件时所需的参数;
lpDirectory:文件名所在的路径,当然,一般来说,在Windows中登“记记”过的程序(如WinWord)
不必提供此参数;
nShowCmd:打开文件后程序窗体如何显示。
该函数的详细文档请读者朋友参阅相应帮助。

其次,我们来举一个例子(以“记事本”为例):
procedure TForm1.OpenBtnClick(Sender:TObject);
begin
ShellExecute(handle,'open','notepad.exe',nil,nil,SW_ShowNormal);
end;
读者朋友可以在你的Delphi环境下试试这段代码,当然,由于使用Windows的API函数,请加上
ShellAPI单元。

二、如何关闭打开的外部程序:
要关闭一个外部程序,只需向他发送一条消息就行了,比如,SendMessage(ExeHandle,WM_Close,0,0);
其中ExeHandle是程序窗体的句柄,但如何得到窗体句柄呢?这是最为关键的地方,幸好Windows提供
了FindWindow()函数,它能够解决这个问题,它有两个参数:
lpClassName:程序的类名;
lpWindowName:程序窗体的标题。

第一种情况也是最简单情况的就是提供确定的[*“确定的”加着重号*]“lpWindowName”参数,如下例:
procedure TForm1.CloseAppClick(Sender: TObject);//确定标题
var Exehandle:Thandle;
begin
//获得句柄-->标题确定
ExeHandle:=findWindow(nil,'文件管理器');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
else
Application.MessageBox('没有打开“文件管理器”!','提示',
MB_IconInformation+MB_OK);
end;

另一种情况是程序窗体没有确定的[*“没有确定的”加着重号*]标题,这就是很多朋友出现疑问的
地方,也是几乎所有参考书均不涉及的地方。比如打开“写字板”程序,它的标题会随着文本文件
名的不同而不同,此时,你要关闭它,就不得不提供程序的类名,但是如何获得程序的类名呢?笔
者在这里向大家介绍一个可行的办法:首先打开程序(此处以“记事本”为例),然后,运行
WinSight32(Delphi自带)或Spy++(VC自带),找到程序(“记事本”)的运行状态,即可找到我
们需要的类名(两者均为“Class Name”项)。参考一个例子:
procedure TForm1.CloseVAppClick(Sender: TObject);//标题不确定
var ExeHandle:Thandle;
begin
//获得句柄-->标题不确定
ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
else
Application.MessageBox('没有打开“记事本”程序!','提示',
MB_IconInformation+MB_OK);
end;
当然,既能提供程序的类名又能提供程序窗体的标题自然就没有讨论的必要了。

这样,我们就可以在自己的程序中打开并关闭任意的外部程序了。
另外,笔者在这里罗嗦一句:上文提到的ShellExeCute()还有有相当“豪华”的用处!细心的
读者可能注意到有的作者的程序里提供了一些广告他们的连接,这其实就是ShellExeCute()的运用
之一,略举一例:
procedure TForm1.HttpClick(Sender: TObject);
begin
ShellExecute(handle,'open','http://liangming.163.net',
nil,nil,SW_ShowNormal);
end;



_/_/_/_/_/_/==============================================\_\_\_\_\_\_
版主:梁明

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧