如何获取自己在程序中运行的外部EXE的Handle

 我来答
星月小木木
2016-02-29 · TA获得超过3.2万个赞
知道大有可为答主
回答量:2.4万
采纳率:0%
帮助的人:9767万
展开全部
大家知道,在一个大型复杂的系统中,有时会调用一些外部程序来帮助我们完成某些特定功能。
我们常用的函数有两个,WinExec(),ShellExecute(),因为ShellExecute()函数主要用于Win32下,功能也强大一些,故而本文只对后者进行讨论。
首先,我们粗略地研究一下ShellExecute()的几个参数:
hwnd:窗体的句柄;
lpOperation:打开程序执行的操作,共预留有“open”、“explore”、“print”三种方式,此参数可以省略,此时将依据打开的文件(lpFile)的类型执行相应的操作,比如:如果lpFile为一文本文件,那么将会在与该文件相关联的程序中打开它;
lpFile:文件名;
lpParamerters:打开文件时所需的参数;
lpDirectory:文件名所在的路径,当然,一般来说,在Windows中登“记记”过的程序(如WinWord)不必提供此参数;
该函数的详细文档请读者朋友参阅相应帮助。
其次,我们来举一个例子(以“记事本”为例):
procedure TForm1.OpenBtnClick(Sender:TObject);beginShellExecute(handle,'open','notepad.exe',nil,nil,SW_ShowNormal);end;读者朋友可以在你的Delphi环境下试试这段代码,当然,由于使用Windows的API函数,请加上ShellAPI单元。
要关闭一个外部程序,只需向他发送一条消息就行了,比如,SendMessage(ExeHandle,WM_Close,0,0);
了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)elseApplication.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)elseApplication.MessageBox('没有打开“记事本”程序!','提示', MB_IconInformation+MB_OK);end;当然,既能提供程序的类名又能提供程序窗体的标题自然就没有讨论的必要了。
这样,我们就可以在自己的程序中打开并关闭任意的外部程序了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式