如何更安全地关闭外部程序? (100分)

  • 主题发起人 主题发起人 coolqiang
  • 开始时间 开始时间
C

coolqiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中,用下面的函数来关闭外部打开的程序,发现对于普通程序没问题,如记事<br>本、计算器等,但如果关闭一些使用了多媒体资源的程序(例如正在播放VCD等),就会<br>出现非法操作。而且程序虽然关闭了,但还能听见声卡在播放歌曲。<br><br>请问各位高手:有没有更好、更安全的关闭外部出现的办法呢?<br><br>function CloseProgram(AProgramName: string): Boolean;<br>var<br>&nbsp; hWndClose &nbsp; &nbsp; &nbsp; &nbsp; : HWnd;<br>begin<br>&nbsp; hWndClose := FindWindow(nil, PChar(AProgramName));<br>&nbsp; if hWndClose &lt;&gt; 0 then<br>&nbsp; begin<br>&nbsp; &nbsp; SendMessage(hWndClose, WM_CLOSE, 0, 0);<br>&nbsp; &nbsp; Result := True;<br>&nbsp; end else<br>&nbsp; begin<br>&nbsp; &nbsp; ShowMessage('没找到指定的应用程序,所以无法关闭!');<br>&nbsp; &nbsp; Result := False;<br>&nbsp; end;<br>end;<br>
 
发送WM_QUERYENDSESSION 消息,如果返回true,则可以安全关闭。<br>否则,不可以。
 
可以用openprocess得到进程handle,再用GetExitCodeProcess ,TerminateProcess试试
 
nick4309:<br>&nbsp; &nbsp; 能写个具体的示例吗?我不知道如何做!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=755909<br>看看.
 
用sendmessagetimeout()发送WM_CLOSE如果到了指定的时间这个程序还没有关闭<br>就用openprocess得到进程handle,再用GetExitCodeProcess ,TerminateProcess<br>我在前面写了好多次这个代码,你找找看
 
杀死一个记事本进程:(如下)等于是Ctrl+Alt+Del后,中止一个进程<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; H:THandle;<br>&nbsp; P:DWORD;<br>begin<br>&nbsp; H:=FindWindow(nil,'无标题 - 记事本');<br>&nbsp; if H&lt;&gt;0 then<br>&nbsp; begin<br>&nbsp; &nbsp; GetWindowThreadProcessId(H,@P);<br>&nbsp; &nbsp; if P&lt;&gt;0 then<br>&nbsp; &nbsp; &nbsp; TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);<br>&nbsp; end;<br>end;
 
要安全的关闭就要用sendmessagetimeout(),如果直接用TerminateProcess容易<br>是系统没有干净的释放资源
 
rainxy2002:<br>&nbsp; &nbsp; 我用你的方法关闭一个多媒体程序,关闭没问题,但再次打开这个多媒体程<br>序就放不出声音了。但我用Ctrl+Alt+Del的方式来关闭,再次打开却很正常!所以你的方<br>法跟Ctrl+Alt+Del不同啊!我现在就是想知道Ctrl+Alt+Del具体是怎样操作的,哪位高手<br>知道啊!<br><br>张无忌:<br>&nbsp; &nbsp; 你的方法我很想试试,但我的水平不高,不知如何下手,能帮我写出这段代码吗?
 
function CloseProgram(AProgramName: string): Boolean;<br>var<br>&nbsp; hWndClose &nbsp; &nbsp; &nbsp; &nbsp; : HWnd;<br>begin<br>&nbsp; hWndClose := FindWindow(nil, PChar(AProgramName));<br>&nbsp; if hWndClose &lt;&gt; 0 then<br>&nbsp; begin<br>&nbsp; &nbsp; //SendMessage(hWndClose, WM_CLOSE, 0, 0);<br>&nbsp; &nbsp; postmessage(hWndClose,wm_quit,1,1);<br>&nbsp; &nbsp; Result := True;<br>&nbsp; end else<br>&nbsp; begin<br>&nbsp; &nbsp; ShowMessage('没找到指定的应用程序,所以无法关闭!');<br>&nbsp; &nbsp; Result := False;<br>&nbsp; end;<br>end;<br>換成上面的代碼試試﹗<br><br>
 
非常感谢大家,特别是hgood,问题已经解决!
 
多人接受答案了。
 
后退
顶部