在一个程序中怎么用API函数判断另外一个程序是否已经运行,又怎么样关闭另一个程序??(100分)

  • 主题发起人 trustzgb
  • 开始时间
T

trustzgb

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在做一个程序,需要用到一个第三方程序,<br>请问怎么用API函数判断另外一个程序是否已经运行,<br>又怎么样关闭另一个程序??最好能有源码,谢谢!
 
下面给出一段在 Delphi 中关闭“计算器”程序为例: <br>var <br>HWndCalculator : HWnd; <br>begin <br>// find the exist calculator window <br>HWndCalculator := Winprocs.FindWindow(nil, '计算器'); // close the exist Calculator <br>if HWndCalculator &lt;&gt; 0 then <br>SendMessage(HWndCalculator, WM_CLOSE, 0, 0); <br>end; <br><br><br>避免二次运行 <br><br>  实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获知前一实例的句柄,从而可以方便地进行判断,但 Windows 95 是抢先式多任务系统,其程序的前一实例句柄恒为零,所以只有另寻其他办法。目前最有效的办法是通过查看是否有相同窗口类名的例程存在来进行判断。下面介绍在Delphi中实现的方法。<br><br>1、对主窗口程序的改动:<br><br>在主窗口(即程序创建的第一个窗口)中interface节加入<br>const<br>CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}<br>MYAPPNAME = "My Delphi Program";<br>并在Form的定义的public节中加入<br>procedure CreateParams(var Params: TCreateParams); override;<br>Procedure RestoreRequest(var message: TMessage); message CM_RESTORE;<br>在implementation节中加入<br>{指定窗口名称}<br>procedure TForm1.CreateParams(var Params: TCreateParams);<br>begin<br>inherited CreateParams(Params);<br>Params.WinClassName := MYAPPNAME;<br>end;<br><br>{处理“恢复”消息}<br>procedure TForm1.RestoreRequest(var message: TMessage);<br>begin<br>if IsIconic(Application.Handle) = TRUE then<br>Application.Restore<br>else<br>Application.BringToFront;<br>end;<br><br>经过以上修改,程序的主窗口的类名已经被指定了,这是进行判断的基础。一般在程序刚开始运行的时候进行判断,所以还要对DPR文件进行修改。<br><br>2、对DPR文件的改动<br><br>在 uses 节中添加 windows、messages这两个单元加入下列语句,注意两个文件中常量CM_RESTORE和MYAPPNAME的定义必须一致<br>const<br>CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}<br>MYAPPNAME = "My Delphi Program";<br>var<br>RvHandle : hWnd;<br><br>将下列语句插到程序最前部(在Application.Initialize之前)<br><br>RvHandle := FindWindow(MYAPPNAME, NIL);<br>if RvHandle &gt; 0 then<br>begin<br>PostMessage(RvHandle, CM_RESTORE, 0, 0);<br>Exit;<br>end;<br>这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。<br><br>&nbsp;<br>
 
var<br>&nbsp; H: THandle;<br>begin<br>&nbsp; H := FindWindow(nil, '目标窗体的Caption');<br>&nbsp; if H &lt;&gt; 0 then { 已运行 }<br>&nbsp; &nbsp; SendMessage(H, WM_Close, 0, 0);<br>end;
 
多人接受答案了。
 
顶部